2016-02-25 2 views
2

У меня есть три сервераЗапуск два серверов сокетов на одном порт

  1. Главный сервер - который слушает весь запрос HTTP
  2. Разъем Сервер 1: Прослушайте тип X запроса сокета
  3. Разъем Сервер 2: Слушайте Y-типы запросов на сокет

Я хочу запустить все три сервера, используя один и тот же IP-адрес: Комбинация портов и все три сервера имеют другое имя хоста. Я обновил локальный DNS, то есть /etc/hosts, чтобы разрешить все три имени домена на тот же IP-адрес, например, 127.0.0.1.

Я использую VHost для разрешения запросов на основе имени хоста и направления запроса на соответствующий сервер. Вот код, который:

var express = require('express'); 
var vhost = require('vhost'); 
var app = express(); 
var https = require('https'); 


var mainServer = <hostname1> ; 
var socketServer1 = <hostname2> ; 
var socketServer2 = <hostname3>; 


var server = https.createServer(<options>, app); 

server.listen(<somePort>,function(){ 
    console.log('VHost running'); 
}); 

var mainApp = require('./app.js'); 
var socketServerApp1 = require('./socketServer1'); 
var socketServerApp2 = require('./socketServer2'); 

app.use(vhost(mainServer, mainApp)); 
app.use(vhost(socketServer1, socketServerApp1(server))); 
app.use(vhost(socketServer2, socketServerApp2(server))); 

Проблема я столкнулся в коде выше есть, если я пытаюсь запустить оба сервера сокета, браузер выдает ошибку, как:

WebSocket connection to 'wss://socketServer1:8443/socket.io/?EIO=3&transport=websocket&sid=qlSXz3os5eDI8c_EAAAC' failed: Connection closed before receiving a handshake response 

Но если только один сокет сервер работает в то время, то все работает отлично для этого сокета сервера, т.е. если я комментирую один из app.use как:

app.use(vhost(mainServer, mainApp)); 
app.use(vhost(socketServer1, socketServerApp1(server))); 
// app.use(vhost(socketServer1, socketServerApp2(server))); 

Разве это не возможно запустить два сокета сервера на одном IP: порт combinati на?

+0

Звучит как работа для прокси-сервера, такого как nginx, который может пересылать каждое входящее соединение, предназначенное для определенного имени хоста, на другой порт на одном сервере. Тогда у вас будет три слушателя, по одному для каждого, все прослушивающие разные порты. Кроме этого, вам, вероятно, придется моделировать ту же функциональность на вашем собственном сервере, имея одного слушателя на нужном порту, который затем распространяет запросы на нужные обработчики. – jfriend00

+0

необходимо, чтобы у вас были два разных сервера websocket? из этого фрагмента кода кажется, что оба прослушивают один и тот же домен. Возможно, 'namespaces' в socket.io может решить вашу проблему. – Gntem

+0

Что вы предлагаете, это объединить socketServer1 и socketServer2? –

ответ

0

Проблема заключалась в том, что на обоих серверах сокетов были отдельные списки, что вызывало ошибку. Проблема с переносом сокета-плеера на приложение vhost устраняет проблему. Ниже приведен код:

var express = require('express'); 
var vhost = require('vhost'); 
var app = express(); 
var https = require('https'); 
var socketio = require('socket.io'); 


var mainServer = <hostname1> ; 
var socketServer1 = <hostname2> ; 
var socketServer2 = <hostname3>; 


var server = https.createServer(<options>, app); 
var io = socketio.listen(server); 

server.listen(<somePort>,function(){ 
    console.log('VHost running'); 
}); 

var mainApp = require('./app.js'); 
var socketServerApp1 = require('./socketServer1'); 
var socketServerApp2 = require('./socketServer2'); 

app.use(vhost(mainServer, mainApp)); 
app.use(vhost(socketServer1, socketServerApp1(io))); 
app.use(vhost(socketServer2, socketServerApp2(io))); 
+0

У вас есть пример всего вашего решения? – ceebreenk

+0

Да, я тоже реализовал тот же код на производстве. Что именно вы ищете? –

+0

Использование двух серверов сокетов внутри основного сервера. У меня есть аналогичная задача, и я пытаюсь реализовать ваше решение. – ceebreenk