是否可以使用相同的端口启用tcp,http和websocket?

Som*_*ent 12 sockets websocket node.js socket.io

我试图在同一端口上启用tcp,httpwebsocket.io通信.我开始使用tcp服务器(部分////行以上),它工作正常.然后我运行了websocket.io上echo服务器示例(部分在////行下面),它也有效.但是当我尝试将它们合并在一起时,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);

});
Run Code Online (Sandbox Code Playgroud)

kan*_*aka 27

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

  • 服务器必须有某种方式来检测(或协商)客户端希望发言的协议.您可以将单独的端口视为检测客户端希望发出的协议的常规方法.

  • 只有一个服务器进程可以实际侦听端口.此服务器可能仅用于检测协议类型,然后转发到多个其他服务器,但每个端口由单个服务器进程拥有.

  • 您不能支持服务器首先说话的多个协议(因为无法检测客户端的协议).您可以支持具有多个客户端优先协议的单个服务器优先协议(通过在接受之后添加短延迟以查看客户端是否将发送数据),但这有点不稳定.

WebSocket协议的明确设计目标是允许WebSocket和HTTP协议共享同一服务器端口.初始WebSocket握手是HTTP兼容的升级请求.

所述websockify服务器/桥接器是可以说同样的端口上5个不同的协议的服务器的一个示例:HTTP,HTTPS(加密HTTP),WS(的WebSockets),WSS(加密的WebSockets)和Flash政策响应.服务器在传入请求的第一个字符处达到峰值,以确定它是否为TLS加密(HTTPS或WSS),或者是否以"<"(Flash策略请求)开头.如果是Flash策略请求,则它会读取请求,响应并关闭连接.否则,它会读取HTTP握手(加密或不加密),并且Connection和Upgrade标头确定它是WebSocket请求还是普通HTTP请求.

免责声明:我做了websockify

  • @DaxJoshi 作为一个单独的问题可能会更好。它实际上也不必与 Websockets 做任何事情。接受 TCP 连接的服务器端口可以处理大量连接。您不需要为每个客户端提供单独的服务器端口。在 websockify 的情况下,如果您希望不同的客户端通过 websockify 连接到不同的目标,那么您应该查看 [TokenFile 插件/目标配置](https://github.com/kanaka/websockify/wiki/Token-based -target-selection)websockify 的功能。 (2认同)