Socket.io: подключение с одного сервера на другой
Я пытаюсь сделать сервер nodejs (socket.io) для связи с другим.
Таким образом, клиент отправляет событие на сервер-концентратор, и этот сервер передает событие на второй сервер для обработки действия.
Я попытался сделать:
var io_client = require( 'socket.io-client' );
а затем
io_client.connect( "second_server_host" );
он работает для соединения, но вы ничего не можете сделать с этим:
debug - set close timeout for client 15988842591410188424
info - socket error Error: write ECONNABORTED
at errnoException (net.js:642:11)
at Socket._write (net.js:459:18)
at Socket.write (net.js:446:15)
Думаю, я делаю это неправильно и пропуская что-то очевидное.
Любые предложения?
Ответы
Ответ 1
Просто наткнулся на этот вопрос, а другой точно так же, как с гораздо лучшим ответом.
fooobar.com/questions/209086/...
Сервер можно выполнять на сервере. Код "клиент" остается таким же, как если бы он находился в браузере. Удивительно, не так ли?
Я просто попробовал это сам, и он отлично работает.
Я запустил 2 сервера - используя один и тот же точный код - один раз на сервере 3000 как сервер, а другой - на порт 3001 в качестве клиента. Код выглядит следующим образом:
, io = require('socket.io')
, ioClient = require('socket.io-client')
....
if ( app.get('port') == 3000 ){
io.listen(server).sockets.on('connection', function (socket) {
socket.on('my other event', function (data) {
console.log(data);
});
});
}else{
function emitMessage( socket ){
socket.emit('my other event', { my: 'data' });
setTimeout(function(){emitMessage(socket)}, 1000);
}
var socket = ioClient.connect("http://localhost:3000");
emitMessage(socket);
}
И если вы видите на стороне сервера "{my: data}" каждую секунду, все отлично работает. Просто убедитесь, что вы запустили клиент (порт 3001) после сервера (порт 3000).
Ответ 2
Для тех, кто ищет короткий рабочий пример ,, см. ниже. Этот пример работает с [email protected]
и [email protected]
.
var port = 3011;
var server = require( 'http' ).createServer( ).listen( port, function () {
console.log( "Express server listening on port " + port );
} );
var io = require( 'socket.io' ).listen( server ).set( "log level", 0 );
io.sockets.on( "connection", function ( socket ) {
console.log( 'Server: Incoming connection.' );
socket.on( "echo", function ( msg, callback ) {
callback( msg );
} );
} );
var ioc = require( 'socket.io-client' );
var client = ioc.connect( "http://localhost:" + port );
client.once( "connect", function () {
console.log( 'Client: Connected to port ' + port );
client.emit( "echo", "Hello World", function ( message ) {
console.log( 'Echo received: ', message );
client.disconnect();
server.close();
} );
} );
Ответ 3
Для связи "Сервер к серверу" или "Приложение к приложению", я думаю, вы должны изучить Redis Pub-sub. Его способный к очень хорошим скоростям и может обрабатывать всю архитектуру очередности сообщений большого приложения.
Вот несколько сложный, но вполне понятный пример использования Redis Pub Sub:
Вспомогательный пример Redis Pub
Ответ 4
ECONNABORTED
означает, что соединение было закрыто "другой стороной".
Например, скажем, у нас есть две программы: A и B. Программа A подключается к программе B, и они начинают отправлять данные взад и вперед. По какой-то причине программа B закрывает соединение. После того, как соединение было закрыто, программа A пытается записать в программу B, но, поскольку соединение закрыто, программа A получит ошибку ECONNABORTED
.
Одна из ваших программ закрыла соединение, а другая не знает об этом и пытается записать в сокет, что приводит к ошибке.
Ответ 5
Собственный модуль Node TCP, вероятно, вы хотите - я хотел сделать то, что вы пытаетесь сделать, но кажется, что тот факт, что WebSockets строго многостраничный для сервера или браузер для многих серверов.
Вы можете сплести стратегию tcp в свою логику websocket.
Используя tcp:
var net = require('net');
var tcp = net.connect({port: 3000, host: 'localhost'});
tcp.on('connect', function(){
var buffer = new Buffer(16).fill(0);
buffer.write('some stuff');
tcp.write(buffer);
});
tcp.on('data', function(data){console.log('data is:', data)});
tcp.on('end', cb);
tcp.on('error', cb);
Я бы использовал шаблон моста с этим:
https://www.google.com/search?q=javascript+bridge+pattern&aq=f&oq=javascript+bridge+pattern&aqs=chrome.0.57.6617&sourceid=chrome&ie=UTF-8
ИЛИ, используйте модуль Node https://npmjs.org/package/ws-tcp-bridge
Я также слышал, что использование redis может быть весьма полезным - Socket.io использует это как резерв.
Надеюсь, что это поможет...
Приветствия
Ответ 6
Для тех, кто хочет сделать это в приложении MeteorJS, я создал новый пакет Meteor joncursi:socket-io-client
для решения этой проблемы. Подробнее см. https://atmospherejs.com/joncursi/socket-io-client для более подробной информации и использования примера. Поскольку я вложил в нее пакетные пакеты NPM, вам не нужно беспокоиться об установке пакетов NPM, объявлении зависимостей NPM.require()
и т.д. И самое главное, вы можете развернуть его на .meteor.com
без заминки.