Как проверить, открыто ли соединение WebSocket.server или закрыто? - PullRequest
0 голосов
/ 06 июля 2018

Я использую узел js, и я не могу понять, как проверить, является ли мое соединение WebSocket.Server открытым или закрытым, есть ли какая-либо функция, такая как socket.readyState?

Я спрашиваю, потому что у меня есть проблема, когда я + кто-то еще перезагружает 192 ...... / xxx в тот же момент, я получаю ошибку Error: listen EADDRINUSE :::3001, и я не могу понять, где она взрывается ..

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

router.get('/', function(req, res, next) {
  wss.on('connection', function connection(ws) {
    ws.on('message', function incoming(message) {
      console.log('Client: Im on... /zzz');
    })
  });

  wss.on('error', function error(err) {
    console.log(wss.clients);
    next(err);
  });

  //??
  //wss.clients.clear();

  db.all('SELECT rowid, * FROM ZZZZZZZZ', (err, rows) => {
    //idk if its ok
    if (err) next(err);

    if (rows.length == 0) {
      res.render('xxxxx/index', {
        AAA: 'empty'
      });
    } else {
      wss.close(function(err) {
        if (err) next(err);
        console.log('closing websocket at /zzz');
        server.close();
        setTimeout(function() {
          wss = new WebSocket.Server({
            port: 3001
          });
        }, 100);
      });
      res.render('xxx/index', {
        AAA: rows
      });
    }
  });
});

И вот что у меня выше моего роутера. Получите

let express = require('express');
let router = express.Router();
let sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database('./xx/xx/xx/xxx/xx/xxx.db');
let WebSocket = require('ws');
let wss = new WebSocket.Server({ port: 3001 });
let server = wss._server;

1 Ответ

0 голосов
/ 06 июля 2018

Похоже, у вас сервер веб-сокетов зависит от конкретной конечной точки. Ошибка, которую вы получаете при попытке привязать несколько серверов веб-сокетов к одному порту. Вам действительно нужен только один сервер веб-сокетов для обработки нескольких клиентских подключений. Я предлагаю вам разделить их и запустить сервер веб-сокетов рядом с приложением Express.

Наличие конечных точек для выполнения определенных действий, таких как закрытие веб-сокета, - это круто, но я бы предложил аутентифицировать их, если вы делаете что-то подобное.

У вас ошибка на 100% на стороне сервера, порт 3001 используется. Он пытается запустить сервер веб-сокетов через порт 3001, и он уже запущен. Вы можете использовать разные порты или просто использовать оригинальный сервер веб-сокетов для обслуживания нескольких клиентов.

Чтобы действительно ответить на вопрос, который вы задали, я считаю, что правильным способом для этого было бы реализовать контрольное сообщение для вашего сервера веб-сокетов. Это должно послать через n количество минут / секунд / миллисекунд (я бы, наверное, пошел с минутами). Желательно, чтобы он был двунаправленным, чтобы ваш сервер и клиенты знали, когда было разорвано соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...