NodeJS Websockets - завершить сокет после отправки данных

1

Я использую пакет ws для создания websockets в nodeJS.

Однако то, что я пытаюсь сделать, - это когда данные отправляются на сервер, сокет должен завершаться. Я не уверен, как это сделать.

Теперь мой код выглядит так, но проблема здесь заканчивается, прежде чем отправляться какие-либо данные.

        ws.on('open', function open() {
        console.log('subscribing');
        ws.send(creds);
        ws.terminate();
        resolve(1);
    });

Каков правильный способ сделать это?

Теги:
websocket
terminate

2 ответа

0

Вот как вы изящно прекратите его:

ws.close()

Но будь то, что вы не можете знать с сервера, когда данные дошли до клиента, если клиент не ответит вам. Итак, что вам нужно сделать, это сделать другое событие, убедиться, что клиент получил данные и ответит вам, а затем прекратите его соединение с этим событием.

    ws.on('open', function open() {
    console.log('subscribing');
    ws.send(creds);
});

    ws.on('credsanswer', function incoming(message) {
    //user has received creds ands calls us back
    ws.close()
});
-1

EDIT: я, возможно, переключил клиентскую сторону с серверной стороны, но концепция все равно остается прежней. Вам нужно отправить сигнал подтверждения.

Это не проблема с websocket. Это скорее проблема TCP/IP. Когда вы отправляете данные, вы можете знать, когда он выгружается из буфера сетевого адаптера, но вы не сможете сказать, когда (или если) последний пакет поступит на другую конечную точку.

Это общая проблема для всех соединений TCP/IP, и единственное абсолютно безопасное решение, которое я нашел в нескольких случаях, - это отправить ACK (подтверждение) обратно клиенту, как это.

На сервере после получения сообщения:

ws.send(""); // acknowledge the server received the message
// don't close the connection, linger instead
// process the message...

На клиенте:

// create ws and immediately set a flag
ws.lingering = false;

// attach receive event before you open the socket
ws.on("data", function () {
  if (ws.lingering)
  {
    // now you can terminate the connection
    ws.terminate();
    resolve(1);
  }
});

// now open the socket and send message without terminating, yet
ws.on("open", function () {
    console.log("subscribing...");
    ws.send(creds);
    ws.lingering = true;
});

Как вы можете заметить, сообщение, отправленное сервером, не проверяется на клиенте, это всего лишь сигнал ждать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню