使用NodeJS + WebSocket-WS:握手后,未收到任何数据消息

时间:2019-02-21 04:13:00

标签: javascript node.js websocket wireshark

我正在尝试在3个客户端和使用Node JS + WS模块(https://www.npmjs.com/package/ws)构建的Web服务器之间建立WebSocket通信。但是,我对websocket通信非常陌生:(

所以问题是我无法访问客户端代码,因为它已嵌入到我拥有的3个设备中。它们中的3个可以完美地与C#内置服务器之间来回发送websocket消息(我也无法访问创建套接字的DLL)。

使用WireShark,我可以看到从HTTP到WebSocket协议的握手升级成功后,我们可以看到以下消息序列:

86  24.796580   192.168.1.127   192.168.1.110   HTTP    237 GET /pub/chat HTTP/1.1 
87  24.831739   192.168.1.110   192.168.1.127   HTTP    183 HTTP/1.1 101 Switching Protocols 
88  24.835353   192.168.1.127   192.168.1.110   TCP 60  1101 → 7788 [ACK] Seq=184 Ack=130 Win=1671 Len=0
96  26.858092   192.168.1.127   192.168.1.110   WebSocket   352 WebSocket Text [FIN] 
97  26.956991   192.168.1.110   192.168.1.127   WebSocket   117 WebSocket Text [FIN]

我尝试了不同的Javascript库,仅使用我拥有的3台设备中的一种,就使用WS库(https://www.npmjs.com/package/ws)获得了成功(消息序列与上述相同)。对于其他两个设备,TCP ACK似乎永远不会到达目的地。请参见以下WireShark日志:

1351    433.758538  192.168.1.127   192.168.1.110   HTTP    237 GET /pub/chat HTTP/1.1 
1352    433.760198  192.168.1.110   192.168.1.127   HTTP    183 HTTP/1.1 101 Switching Protocols 
1353    433.764133  192.168.1.127   192.168.1.110   TCP 60  1320 → 7788 [ACK] Seq=184 Ack=130 Win=1671 Len=0
1361    435.824357  192.168.1.127   192.168.1.110   TCP 60  [TCP Dup ACK 1353#1] 1320 → 7788 [ACK] Seq=184 Ack=130 Win=1671 Len=0
1371    439.818889  192.168.1.127   192.168.1.110   TCP 60  [TCP Dup ACK 1353#2] 1320 → 7788 [ACK] Seq=184 Ack=130 Win=1671 Len=0
1400    447.824172  192.168.1.127   192.168.1.110   TCP 60  [TCP Dup ACK 1353#3] 1320 → 7788 [ACK] Seq=184 Ack=130 Win=1671 Len=0
1408    451.759634  192.168.1.127   192.168.1.110   TCP 60  1320 → 7788 [FIN, ACK] Seq=184 Ack=130 Win=1671 Len=0
1409    451.762178  192.168.1.110   192.168.1.127   TCP 54  7788 → 1320 [ACK] Seq=130 Ack=185 Win=64240 Len=0
1410    451.762408  192.168.1.110   192.168.1.127   TCP 54  7788 → 1320 [FIN, ACK] Seq=130 Ack=185 Win=64240 Len=0
1411    451.765244  192.168.1.127   192.168.1.110   TCP 60  1320 → 7788 [RST, ACK] Seq=185 Ack=130 Win=0 Len=0
1412    451.766881  192.168.1.127   192.168.1.110   TCP 60  1320 → 7788 [RST, ACK] Seq=185 Ack=131 Win=0 Len=0

如您所见,在3个DUP ACK之后,客户端发送FIN / ACK完成连接。

我使用WS网页上描述的“简单服务器”只是为了接收来自客户端的消息并将其打印在控制台中。请参阅下面的代码:

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 7788 });

wss.on('connection', function connection(ws) {

  console.log('connection...');

  ws.on('message', function incoming(message) {

    var client_message = JSON.parse(message);
    console.log('message received: %s', JSON.stringify(client_message));

    var server_timestamp = currentFormattedDate();  

    var response = {
      "ret": client_message.cmd,
      "result": true,
      "cloudtime": server_timestamp
    };

    console.log('responseeeee message: %s', JSON.stringify(response));
    ws.send(JSON.stringify(response));

  });

});

function currentFormattedDate() {
  var current_date = new Date();
  return (current_date.getFullYear() + "-" +
         ("0" + (current_date.getMonth() + 1)).substr(-2) + "-" +
         ("0" + current_date.getDate()).substr(-2) + " " +
         ("0" + current_date.getHours()).substr(-2) + ":" +
         ("0" + current_date.getMinutes()).substr(-2) + ":" +
         ("0" + current_date.getSeconds()).substr(-2));

}

我真的不知道我在做什么错,但是这听起来像是缺少服务器配置,因为3台设备可以完美地传输到用C#编写的服务器上。

您的帮助将不胜感激。预先感谢。

0 个答案:

没有答案