是否有可能使用相同的端口,以使TCP,HTTP和WebSocket的呢?(Is it possibl

2019-07-04 20:04发布

我试图启用TCP , HTTP和websocket.io通信在同一端口上。 我开始了与TCP服务器(以上////线部分),它的工作。 然后我跑了上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);

});

Answer 1:

您可以通过相同的端口处理多种不同的协议,但也有一些注意事项:

  • 必须有某种方式让服务器来检测(或协商)客户端希望发言的协议。 你可以把单独的端口作为检测的客户希望发言的协议,以正常的方式。

  • 只有一个服务器进程可以在该端口上实际收听。 这个服务器可能仅用于检测协议的类型,然后转发到多个其他服务器的目的,但每个端口是由一个单一的服务器进程所拥有。

  • 你可以不支持在服务器先说(因为没有办法检测客户端的协议),多协议。 可以支持与多个客户第一协议的单台服务器一协议(通过添加短暂延时后接受以查看是否客户端发送数据),但是这是一个有点靠不住。

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

所述websockify服务器/桥接器是可以说同样的端口上5个不同的协议的服务器的一个示例:HTTP,HTTPS(加密HTTP),WS(的WebSockets),WSS(加密的WebSockets)和Flash政策响应。 在传入请求的第一个字符的服务器峰以确定它是否是TLS加密(HTTPS或WSS),或是否开始于“<”(闪光灯策略请求)。 如果它是一个Flash策略请求,那么它会读取请求,响应并关闭连接。 否则,它读取HTTP握手(加密的或未未),并连接和升级头确定它是否是一个网页套接字请求或纯HTTP请求。

免责声明:我做了websockify



Answer 2:

简短的回答 - 不,你不能有不同的TCP / HTTP / WebSocket的服务器相同的端口上运行。

稍长的答案 - 在TCP之上的WebSockets都和HTTP工作。 所以,你能想到的一个HTTP服务器或WebSocket的服务器作为一个自定义的TCP服务器(有一些国家MGMT和协议特定的编码/解码)的。 它是不可能有多个套接字绑定到相同的端口/协议对一台机器上,因此第一个将赢得和下面的人会得到套接字绑定例外。



文章来源: Is it possible to enable tcp, http and websocket all using the same port?