我正在尝试在同一端口上启用tcp,http和websocket.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);
});
答案 0 :(得分:25)
您可以使用同一端口处理多个不同的协议,但有一些注意事项:
服务器必须有某种方式来检测(或协商)客户端希望发言的协议。您可以将单独的端口视为检测客户端希望发出的协议的常用方法。
实际上只有一个服务器进程可以侦听端口。此服务器可能仅用于检测协议类型,然后转发到多个其他服务器,但每个端口由单个服务器进程拥有。
您不能支持服务器首先说话的多个协议(因为无法检测客户端的协议)。您可以支持具有多个客户端优先协议的单个服务器优先协议(通过在接受之后添加一个短延迟来查看客户端是否将发送数据),但这有点不稳定。
WebSocket协议的明确设计目标是允许WebSocket和HTTP协议共享同一服务器端口。初始WebSocket握手是HTTP兼容的升级请求。
websockify服务器/网桥是服务器的一个示例,它可以在同一端口上说5种不同的协议:HTTP,HTTPS(加密HTTP),WS(WebSockets),WSS(加密WebSockets)和Flash政策回应。服务器在传入请求的第一个字符处达到峰值,以确定它是否为TLS加密(HTTPS或WSS)或者是否以“&lt;”开头(Flash政策请求)。如果是Flash策略请求,则它会读取请求,响应并关闭连接。否则,它会读取HTTP握手(加密或不加密),并且Connection和Upgrade标头确定它是WebSocket请求还是普通HTTP请求。
免责声明:我制作了websockify
答案 1 :(得分:0)
简短回答 - 不,你不能在同一个端口上运行不同的TCP / HTTP / Websocket服务器。
Longish回答 - websockets和HTTP都在TCP之上工作。因此,您可以将http服务器或websocket服务器视为自定义TCP服务器(具有某些状态管理和协议特定的编码/解码)。不可能有多个套接字绑定到计算机上的相同端口/协议对,因此第一个将赢,而后续的将获得套接字绑定异常。