我正在尝试在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#编写的服务器上。
您的帮助将不胜感激。预先感谢。