Я пытаюсь создать соединение через веб-сокет между 3-мя клиентами и веб-сервером, созданным с помощью модуля Node JS + WS (https://www.npmjs.com/package/ws). Однако я очень новичок в связи через веб-сокет: (
Так чтопроблема в том, что у меня нет доступа к клиентскому коду, так как он встроен в 3 имеющееся у меня оборудование. 3 из них отлично работают, передавая и получая сообщения веб-сокетов на сервер и встроенный в C # (которого у меня тоже нетдоступ к 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 и добился успеха (та же последовательность сообщений, что и выше), используя библиотеку 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, клиент отправилd FIN / ACK для завершения соединения.
Я использую Simple Server, описанный на веб-странице 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 #.
Ваша помощь будет принята с благодарностью.Заранее спасибо.