2015-04-30 6 views
3

Мне нужно, чтобы два разных сервера socket.io обменивались данными друг с другом. Я не могу использовать socket.io-client, так как он не различает browser to server соединений и server to server соединений. Поэтому я пытаюсь использовать socket.io-redis.Как отправить сообщение другому серверу socket.io с помощью socket.io-redis?

Один из них является сервером express-socket.io, а другой - автономным сервером socket.io. Оба устройства настроены на использование адаптера socket.io-redis. Я не вижу сообщение, полученное на сервере Server1 от Server2. Также ошибок нет.

Сервер1:

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

 
var server = app.listen(8000,function() { 
 
\t console.log('server listening at port 8000'); 
 
}); 
 

 
var io = require('socket.io')(server); 
 
var redis = require('socket.io-redis'); 
 
io.adapter(redis({ host: 'localhost', port: 6379 })); 
 

 
io.on('message',function (message) { 
 
\t console.log(message); 
 
}); 
 

 
io.on('connection',function (socket) { 
 
\t console.log('connection'); 
 
\t socket.on('message',function (message) { 
 
\t \t console.log(message); 
 
\t }); 
 
});

Сервер2:

var io = require('socket.io')(3000); 
 
var redis = require('socket.io-redis'); 
 
io.adapter(redis({ host: 'localhost', port: 6379 })); 
 

 
io.emit('message','Hi');

+0

Вы проверили хранилище redis, если события написаны правильно? – cdagli

+0

@cdagli вы можете посмотреть на http://stackoverflow.com/questions/36874287/nodejs-socket-io-server-server-communication Я вижу от вас пользователя, что у вас есть некоторый опыт socket.io :). Правильно ли Коваль, что я не могу связывать сервер с сервером с socket.io-redis? – adaniluk

ответ

3

Socket.io-Redis не позволит Вам фиксировать события с одного сервера на другой. Как это работает, это просто «нажимает» сообщения, передаваемые одним сервером на другие подключенные серверы, поэтому они могут передавать эти сообщения.

Если экземпляр A получит событие (то есть io.on('connect')), вы не сможете захватить это событие в экземпляре B. Однако вы сможете отправить сообщение всем клиентам, подключенным ко всем экземплярам, ​​просто позвонив

socket.on('message', function(socket){ 
    socket.emit('hello', 'New message'); 
} 

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

Если вам нужны, чтобы ваши серверы «разговаривали» друг с другом, вы можете использовать существующий транспортный уровень - экспресс-сервер. Вы можете создать обработчик для различных типов запросов, например:

app.get('/api/clientCount', function(req, res){ 
    res.send(io.engine.clientsCount); 
}); 

Таким образом, вы можете обмениваться информацией между Socket.io случаями, изменить свое состояние, чтобы все экземпляры отчет об использовании, и т.д., что нужно помнить - проверка подлинности запросов ; Вы не хотите получать эти звонки от неавторизованных пользователей :)

Смежные вопросы