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 без заминки.