【发布时间】:2012-11-27 06:46:03
【问题描述】:
我正在尝试在同一端口上启用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);
});
【问题讨论】:
-
HTTP 通常运行在 TCP 之上。 HTTP 和 TCP 是什么意思?
-
这就是我怀疑的原因。我的服务器需要通过浏览器与 websockets 通信,并通过移动应用程序与 TCP 连接通信。因此我需要这两种协议。
-
也许您可以作为原始 TCP 进行侦听,如果检测到 HTTP,则手动转发到其他处理程序。同样,如果您从 HTTP 服务器检测到 WS(WS 以 HTTP 开头),请再次委托。
-
通常你应该使用 HTTP 并通过 URL 进行区分,或者在不同的端口上运行原始 TCP。
-
请注意,HTTP 流通常使用 GZIP 可以很好地压缩,并且使用原始套接字不会获得太多收益(使用一个双工 TCP 连接而不是两个单工连接并不是真正的胜利)。你确实得到了消息序列化(除非 WS 也是双工的)。
标签: node.js sockets websocket socket.io