node.js - 是否可以使用同一个端口启用 tcp、http 和 websocket?

标签 node.js sockets websocket socket.io

我正在尝试启用 tcp , httpwebsocket.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);

});

最佳答案

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

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

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

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

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

websockify server/bridge 是可以在同一端口上使用 5 种不同协议(protocol)的服务器示例:HTTP、HTTPS(加密 HTTP)、WS(WebSockets)、WSS(加密 WebSockets)和 Flash 策略响应。服务器查看传入请求的第一个字符以确定它是 TLS 加密的(HTTPS 或 WSS)还是以“<”开头(Flash 策略请求)。如果是 Flash 策略请求,则它会读取请求、响应并关闭连接。否则,它会读取 HTTP 握手(加密与否),连接和升级 header 确定它是 WebSocket 请求还是普通 HTTP 请求。

免责声明:我制作了 websockify

关于node.js - 是否可以使用同一个端口启用 tcp、http 和 websocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13791050/

相关文章:

javascript - 错误: Cannot find module 'canvas' - Chart.js

node.js - 错误 C2039: 'IsNearDeath' : 不是 'Nan::Persistent<v8::Object,v8::NonCopyablePersistentTraits<T>> 的成员

java - 如何修复java中的 "java.net.SocketException"错误

java - java多线程环境下如何关闭线程

java - 服务器端的 webSockets 连接管理

node.js - 可能的 socket.io 内存泄漏

javascript - Nodejs模块函数返回未定义,不是异步的

Linux:INET 监听套接字绑定(bind)的更细粒度控制?

rest - 戈朗 : Broadcast messages to websocket when a particular POST JSON is received

java - websocket 双向概念如何工作?