Использование NodeJS + WebSocket-WS: после рукопожатия сообщение с данными не принимается - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь создать соединение через веб-сокет между 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 #.

Ваша помощь будет принята с благодарностью.Заранее спасибо.

...