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

我想在同一个端口上启用tcp , http和websocket.io通信。 我开始使用tcp服务器(部分上面////线),它的工作。 然后我运行了websocket.io (下面的////行)部分find的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); }); 

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

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

  • 只有一个服务器进程可以实际监听端口。 该服务器可能只能用于检测协议types,然后转发到多个其他服务器,但每个端口都由一个服务器进程拥有。

  • 您不能在服务器先说话的地方支持多种协议(因为没有办法检测客户端的协议)。 你可以使用多个客户端优先协议来支持一个单一的服务器优先协议(通过在接受之后join一个短暂的延迟来查看客户端是否发送数据),但是这有点不可靠。

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

websockify服务器/网桥是一个服务器的例子,它可以在同一个端口上说5种不同的协议:HTTP,HTTPS(encryption的HTTP),WS(WebSockets),WSS(encryption的WebSocket)和Flash策略响应。 服务器在传入请求的第一个字符处达到峰值,以确定是否进行了TLSencryption(HTTPS或WSS)或是否以“<”(Flash策略请求)开头。 如果是Flash策略请求,则它读取请求,响应并closures连接。 否则,它将读取HTTP握手(encryption或不encryption),并且连接和升级标头确定它是WebSocket请求还是纯HTTP请求。

免责声明:我做了websockify

简短的回答 – 不,你不能在同一个端口上运行不同的TCP / HTTP / Websocket服务器。

较长的回答 – Websockets和HTTP都在TCP之上工作。 所以你可以把一个http服务器或websocket服务器想象成一个自定义的TCP服务器(具有一些状态pipe理和协议特定的编码/解码)。 这是不可能有多个套接字绑定到一台机器上的相同的端口/协议对,所以第一个将赢得和下面的将获得套接字绑定例外。