Как подключить два сервера node.js с websockets?
Здесь моя проблема:
У меня есть сервер A, запустив node.js и используя socket.io для общения с клиентами (веб-браузеры). Все это прекрасно работает и денди.
Однако теперь, когда у меня есть сервер B, которому также нужно подключиться к серверу A через веб-порты, я ударил стену. Ни один из найденных мной клиентов node.js websocket не будет работать с socket.io на сервере А.
Итак, это тот случай, к которому я стремлюсь:
.--------. .----------. .----------.
| CLIENT | <--> | SERVER A | <--> | SERVER B |
'--------' '----------' '----------'
Клиент-сервер. Соединение выполняется через socket.io
Теперь сервер B (работает node.js) должен подключиться к серверу A через websocket (чтобы пройти через порт 80). Но...
Даже пример кода в модуле socket.io-client не работает...:/
// Connect to server
var socket = new io.Socket('localhost', {port: 8080});
socket.connect();
// Add a connect listener
socket.on('connect', function(socket) {
console.log('Connected.');
});
Код просто проходит без каких-либо ошибок, и выполнение заканчивается через несколько секунд.
Обновление: примеры кода
Сервер (который работает просто отлично) выглядит следующим образом:
// Load requirements
var http = require('http'),
io = require('socket.io');
// Create server & socket
var server = http.createServer(function(req, res){
// Send HTML headers and message
res.writeHead(404, {'Content-Type': 'text/html'});
res.end('<h1>Aw, snap! 404</h1>');
});
server.listen(8080);
io = io.listen(server);
// Add a connect listener
io.sockets.on('connection', function(socket) {
console.log('Client connected.');
// Disconnect listener
socket.on('disconnect', function() {
console.log('Client disconnected.');
});
});
Клиент выглядит следующим образом
console.log('1');
// Connect to server
var io = require('socket.io-client')
var socket = new io.Socket('localhost', {port: 8080});
socket.connect();
console.log('2');
// Add a connect listener
socket.on('connect', function(socket) {
console.log('Connected!');
});
console.log('3');
1, 2 и 3 печатаются просто отлично, никаких ошибок, и через несколько секунд процесс просто выходит из
Кроме того, сервер A ничего не выводит в журнал, хотя у меня есть запись в socket.io на "все".
Ответы
Ответ 1
Оказывается, по какой-то причине я использовал старые примеры, хотя я их троился. Ну, да.
Также выяснилось, что socket.io-клиент разбит на последний Node (6.x.x). Удалось найти обновление от github, заменив файлы и yay, все работает!
Изменить. К сожалению, я не сохранял никаких ссылок на рабочие примеры, но после быстрого проскальзывания через код кажется, что только изменения были в коде клиента, который теперь выглядит следующим образом:
console.log('1');
// Connect to server
var io = require('socket.io-client')
var socket = io.connect('localhost:8080', {reconnect: true});
console.log('2');
// Add a connect listener
socket.on('connect', function(socket) {
console.log('Connected!');
});
console.log('3');
Ответ 2
Вот фрагмент кода, который я написал, он использует socket.io 1.0.6 и socket.io-client 1.0.6. Дело в следующем:
Сервер A (клиент Socket.io) < --- > Сервер B (сервер Socket.io)
Сервер B (сервер):
// Load requirements
var http = require('http'),
io = require('socket.io');
// Create server & socket
var server = http.createServer(function(req, res)
{
// Send HTML headers and message
res.writeHead(404, {'Content-Type': 'text/html'});
res.end('<h1>Aw, snap! 404</h1>');
});
server.listen(8080);
io = io.listen(server);
// Add a connect listener
io.sockets.on('connection', function(socket)
{
console.log('Client connected.');
// Disconnect listener
socket.on('disconnect', function() {
console.log('Client disconnected.');
});
});
Сервер A (клиент):
console.log('1');
// Connect to server
var io = require('socket.io-client');
var socket = io.connect('http://localhost:8080', {reconnect: true});
console.log('2');
// Add a connect listener
socket.on('connect', function(socket) {
console.log('Connected!');
});
console.log('3');
Если я использую localhost: 8080 только на клиентском сервере, он не подключается.
Ответ 3
Для будущих людей:
Вот 2 очень простых приложения Node.js
, которые используют socket.io для соединения, отправки и получения сообщений друг с другом.
Необходимый пакет:
npm install socket.io
Node-App-1 server.js:
var io = require('socket.io').listen(3000);
io.on('connection', function (socket) {
console.log('connected:', socket.client.id);
socket.on('serverEvent', function (data) {
console.log('new message from client:', data);
});
setInterval(function () {
socket.emit('clientEvent', Math.random());
console.log('message sent to the clients');
}, 3000);
});
Node-App-2 client.js:
var io = require('socket.io-client');
var socket = io.connect("http://localhost:3000/", {
reconnection: true
});
socket.on('connect', function () {
console.log('connected to localhost:3000');
socket.on('clientEvent', function (data) {
console.log('message from the server:', data);
socket.emit('serverEvent', "thanks server! for sending '" + data + "'");
});
});