NodeJS 是否可以使用同一个端口启用tcp、http和WebSocket?

qjp7pelc  于 2023-02-12  发布在  Node.js
关注(0)|答案(3)|浏览(500)

我试图在同一个端口上启用tcphttpwebsocket.io通信。我开始使用tcp服务器(////行上方的部分),它工作了。然后我运行echo server example found on websocket.io(///行下方的部分),它也工作了。但是当我试图将它们合并在一起时,tcp不再工作了。
那么,有没有可能启用tcp,http和websockets都使用同一个端口?或者我必须在另一个端口上监听tcp连接?

var net = require('net');
var http = require('http');
var wsio = require('websocket.io');

var conn = [];

var server = net.createServer(function(client) {//'connection' listener
    var info = {
        remote : client.remoteAddress + ':' + client.remotePort
    };
    var i = conn.push(info) - 1;
    console.log('[conn] ' + conn[i].remote);

    client.on('end', function() {
        console.log('[disc] ' + conn[i].remote);
    });

    client.on('data', function(msg) {
        console.log('[data] ' + conn[i].remote + ' ' + msg.toString());
    });

    client.write('hello\r\n');
});

server.listen(8080);

///////////////////////////////////////////////////////////

var hs = http.createServer(function(req, res) {
    res.writeHead(200, {
        'Content-Type' : 'text/html'
    });
    res.end(['<script>', "var ws = new WebSocket('ws://127.0.0.1:8080');", 'ws.onmessage = function (data) { ws.send(data); };', '</script>'].join(''));
});

hs.listen(server);

var ws = wsio.attach(hs);
var i = 0, last;

ws.on('connection', function(client) {

    var id = ++i, last

    console.log('Client %d connected', id);

    function ping() {
        client.send('ping!');
        if (last)
            console.log('Latency for client %d: %d ', id, Date.now() - last);
        last = Date.now();
    };

    ping();
    client.on('message', ping);

});
dpiehjr4

dpiehjr41#

您可以让同一个端口处理多个不同的协议,但有一些注意事项:

  • 服务器必须有某种方法来检测(或协商)客户机希望使用的协议。您可以将单独的端口视为检测客户机希望使用的协议的常规方法。
  • 实际上只能有一个服务器进程在侦听端口。此服务器可能仅用于检测协议类型,然后转发到多个其他服务器,但每个端口都由单个服务器进程拥有。
  • 在服务器先发言的情况下,您不能支持多个协议(因为无法检测客户端的协议),您可以支持单个服务器先协议和多个客户端先协议(通过在接受后添加一个短暂的延迟,以查看客户端是否会发送数据),但这有点不可靠。

WebSocket协议的一个明确的设计目标是允许WebSocket和HTTP协议共享同一个服务器端口。初始WebSocket握手是一个HTTP兼容的升级请求。
websockify服务器/网桥是可以在同一端口上使用5种不同协议的服务器的示例:超文本传输协议、超文本传输协议(加密HTTP)、WS(网络套接字),WSS(加密的WebSockets)和Flash策略响应。服务器查看传入请求的第一个字符,以确定它是否经过TLS加密(HTTPS或WSS)或是否以"〈"开头(Flash策略请求),如果是Flash策略请求,则读取请求,响应并关闭连接,否则,它读取HTTP握手(加密或未加密),并且Connection和Upgrade报头确定它是WebSocket请求还是普通HTTP请求。

  • 免责声明:我制作了网络游戏 *
7hiiyaii

7hiiyaii2#

简短的回答-不,您不能让不同的TCP/HTTP/WebSocket服务器运行在同一个端口上。
长答案-websockets和HTTP都在TCP之上工作。所以你可以把http服务器或websockets服务器想象成一个自定义的TCP服务器(带有一些状态管理和协议特定的编码/解码)。在一台机器上不可能有多个套接字绑定到同一个端口/协议对,所以第一个会赢,后面的会得到套接字绑定异常。

rqqzpn5f

rqqzpn5f3#

nginx允许您在同一端口上运行http和WebSocket,并且它会转发到正确的application:https://medium.com/localhost-run/using-nginx-to-host-websockets-and-http-on-the-same-domain-port-d9beefbfa95d

相关问题