web-dev-qa-db-ja.com

Socket.io:あるサーバーから別のサーバーに接続する

Nodejs(socket.io)サーバーを別のサーバーと通信できるようにしようとしています。したがって、クライアントは「ハブ」サーバーにイベントを発行し、このサーバーはアクションを処理するために2番目のサーバーにイベントを発行します。

私がやろうとした:

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)

私はそれを間違ってやっていて、明らかな何かを見逃していると思います。

助言がありますか?

ちょうどこの質問に出くわしました、そして別のものはそれと同じようにはるかに良い答えを持っています。

https://stackoverflow.com/a/14118102/1068746

サーバー間で行うことができます。 「クライアント」コードは、ブラウザ上にある場合と同じままです。すごいですね。

自分で試してみましたが、問題なく動作します。

2台のサーバーを(まったく同じコードを使用して)1回はサーバーとしてポート3000で実行し、もう1回はクライアントとしてポート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}」の出力が毎秒表示される場合は、すべてが正常に機能します。サーバー(ポート3000)の後にクライアント(ポート3001)を実行してください。

9
guy mograbi

短いものを探している人のために実例、以下を参照してください。この例は、[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();
    } );
} );
6

サーバー間またはアプリ間通信については、RedisPub-subを調べる必要があると思います。非常に優れた速度が可能で、大きなアプリのメッセージキューイングアーキテクチャ全体を処理できます。

これは、Redis Pub Subを使用するための少し複雑ですが非常に理解しやすい例です: Redis Pub Subの例

2
Dragunov

ECONNABORTEDは、接続が「反対側」によって閉じられたことを意味します。

たとえば、AとBの2つのプログラムがあるとします。プログラムAはプログラムBに接続し、データの送受信を開始します。プログラムBは、何らかの理由で接続を閉じます。接続が閉じられた後、プログラムAはプログラムBに書き込もうとしますが、接続が閉じられているため、プログラムAはエラーECONNABORTEDを受け取ります。

プログラムの1つが接続を閉じましたが、もう1つは接続を認識せず、ソケットに書き込もうとしたため、エラーが発生しました。

ネイティブNode TCPモジュールはおそらくあなたが望むものです-私はあなたがやろうとしていることをやりたかったのですが、WebSocketが厳密にmany-browserからserver、またはbrowserからmany-server。

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 Module https://npmjs.org/package/ws-tcp-bridge を使用します

また、redisを使用すると非常に役立つと聞きました。Socket.ioはこれをフォールバックとして使用します。

お役に立てれば...

乾杯

0
Cody

MeteorJS アプリでこれを実行しようとしている人のために、この問題を解決するために新しいMeteorパッケージjoncursi:socket-io-clientを作成しました。詳細と使用例については、 https://atmospherejs.com/joncursi/socket-io-client を参照してください。 NPMバイナリをパッケージにバンドルしているので、NPMパッケージのインストール、NPM.require()依存関係の宣言などについて心配する必要はありません。そして何よりも、.meteor.comにデプロイできます。ヒッチ。

0
Jon Cursi