Разрешить сокету и http-серверу прослушивать один и тот же порт

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

Я что-то пробовал, но у меня возник вопрос: как создать сервер сокетов и сервер HTTP, которые прослушивают один и тот же порт с Node.JS? Если я запускаю код ниже, у меня есть это исключение:

Ошибка: слушайте EADDRINUSE

Вот мой код сервера:

let port = 8080;

const httpServer = require('http'),
      app = require('express')(),
      socketServer = http.Server(app),
      io = require('socket.io')(httpServer);

httpServer.createServer(function (req, res) {
    console.log('http server created on 8080');
}).listen(port);

socketServer.listen(port, function(){
    console.log('listening on 8080');
});

заранее спасибо


person H. Pauwelyn    schedule 16.11.2016    source источник
comment
Вы не можете. Это не имеет смысла. TCP не позволяет вам таким образом выстрелить себе в ногу.   -  person user207421    schedule 16.11.2016


Ответы (1)


Похоже, вы хотите что-то похожее на это:

const port = 8080;

let app    = require('express')();
let server = app.listen(port);
let io     = require('socket.io')(server);

Это прикрепляет приложение Express и сервер socket.io к одному и тому же HTTP-серверу (который возвращается app.listen()). Вот как вы запускаете приложение и сервер socket.io на одном и том же порту.

person robertklep    schedule 16.11.2016
comment
Как два сервера (http и socket.io) могут работать на одном порту? Насколько я знаю, только одно приложение/сервер может открывать порт в системе. Не могли бы вы объяснить: связаны ли httpsserver и socket.io или взаимодействуют друг с другом или с независимым приложением, используя один и тот же порт? Это выше моей головы.. - person OwlR; 25.04.2019
comment
@OwlR socket.io использует HTTP-сервер Express для перехвата и обработки конкретных запросов, необходимых для его работы. Итак, есть один HTTP-сервер, который используется двумя серверами приложений: Express и socket.io. - person robertklep; 26.04.2019
comment
хм ... не ясно, как работает перехват, но все же есть идея. - person OwlR; 26.04.2019