当前位置: 首页 > 面试题库 >

是否可以使用同一端口启用tcp,http和websocket?

法弘壮
2023-03-14
问题内容

我正在尝试在同一端口上启用tcp,http和websocket.io通信。我开始使用tcp服务器(在////行上方),它可以正常工作。然后,我运行了在websocket.io(位于////行下方的部分)上找到的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);

});

问题答案:

您可以通过同一端口处理多个不同的协议,但有一些警告:

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

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

  • 您不能在服务器首先讲话的情况下支持多种协议(因为无法检测到客户端的协议)。您可以支持具有多个客户端优先协议的单个服务器优先协议(通过在接受之后添加一小段延迟以查看客户端是否将发送数据),但这有点不可思议。

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

所述websockify服务器/桥接器是可以说同样的端口上5个不同的协议的服务器的一个示例:HTTP,HTTPS(加密的HTTP),WS(的WebSockets),WSS(加密的WebSockets)和Flash政策响应。服务器将窥视传入请求的第一个字符,以确定它是否经过TLS加密(HTTPS或WSS)或是否以“
<”开头(Flash策略请求)。如果这是Flash策略请求,则它将读取请求,响应并关闭连接。否则,它将读取HTTP握手(加密或不加密),并且Connection和Upgrade标头确定它是WebSocket请求还是纯HTTP请求。

免责声明:我做了websockify



 类似资料:
  • 我正在使用React构建一个简单的项目,我希望它连接到一个数据库(mongodb Atlas)。但是,我只能使用Node连接到我的数据库。是否可以在同一个端口3000上运行两个节点和反应? 我还将Express与Node一起使用,因为我发现在制作具有相同navBar和页脚的新页面时使用ejs文件非常方便。 有没有可能把这三个人放在一个港口?

  • 问题内容: 我正在尝试通过HTML执行以下操作: 基本上用户按下登录按钮,就会调用onLogin方法,该方法会将帖子发送到我的API。帖子工作正常,我确实在.then()承诺中得到了答复。 但是,尝试执行类似的操作并不会以我期望用户登录时HTML会执行的操作来更新DOM。 当我在promise中收到响应并且找不到“ vm”实例时,可能是我处于某种后台线程(对不起,这里是移动开发人员)? 谢谢 问题

  • 我们有一个运行良好的C#FTP类,但是TCP端口快用完了,因为它们都处于等待时间状态,无法重用。我们可以减少注册表中的默认等待时间,但我们宁愿重用端口。 在服务器端套接字进入TIME-WAIT状态并且客户机在2MSL(默认TIME-WAIT时间)内重新连接到服务器的情况下,可能会发生以下两种情况: 1.服务器不会响应来自客户端的SYN数据包,因为套接字处于时间等待状态。 2.服务器可以接受来自客户

  • 我想编写一个tcp服务器和客户端应用程序,在客户端使用相同端口号的情况下,它们之间有几个不同的连接。 据我所知,服务器有一个侦听器端口,当客户端调用它时,我会在服务器端为这个新连接获得一个新的套接字,当我调用它时 正当所以在服务器端,我可以识别我与这个新套接字的连接,并通过它发送数据。 现在,我的理解与客户端的问题。我打电话的时候会拿到插座 所以我只有一个插座。在 我可以指定远程地址等等。所以当我

  • ServerSocket是来自Java.NET API的ServerSocket normal Socket是来自Java.NET API的Socket 是的,这里的ServerSocket是指建立连接后从ServerSocket.Accept返回的套接字

  • 我想建立一个节点集群。前面有负载平衡器的js服务(由于某些原因,不能有粘性会话)。 让我们想象一下,我有两个节点,客户机(例如,浏览器,使用socket.io)发送wss://请求,第一个节点从LB获取请求,然后它发送回客户机的“HTTP/1.1 101 Web套接字协议握手”响应。 > 在使用插座的情况下。在WebSocket连接建立以提高性能之前,它可能仍然会回退并通过http发送长轮询。这些