Socket.io:从一台服务器连接到另一台服务器

时间:2012-01-26 13:35:12

标签: node.js socket.io

我正在尝试使nodejs(socket.io)服务器与另一个服务器进行通信。 因此,客户端向“hub”服务器发出一个事件,该服务器向某个第二个服务器发送一个事件来处理该动作。

我试着这样做:

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)

我想我做错了,错过了一些明显的东西。

有什么建议吗?

6 个答案:

答案 0 :(得分:9)

刚刚遇到了这个问题,而另一个问题就像是一个更好的答案。

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

您可以执行服务器到服务器。 “客户端”代码与浏览器上的代码保持一致。太棒了不是吗?

我自己尝试过,它运行正常..

我运行了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}”,那么一切都很好。只需确保在服务器(端口3000)之后运行客户端(端口3001)。

答案 1 :(得分:6)

对于任何寻找简短工作示例的人,请参阅下文。此示例适用于socket.io@0.9.16socket.io-client@0.9.16

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();
    } );
} );

答案 2 :(得分:2)

对于Server to Server或App to App通信,我认为您应该查看Redis Pub-sub。它具有非常好的速度,并且可以处理大型应用程序的整个消息队列架构。

这是使用Redis Pub Sub的一个稍微复杂但非常容易理解的示例: Redis Pub Sub Example

答案 3 :(得分:0)

ECONNABORTED表示连接已被“另一方”关闭。

例如,假设我们有两个程序,A和B.程序A连接到程序B,它们开始来回发送数据。程序B由于某种原因关闭连接。连接关闭后,程序A尝试写入程序B,但由于连接已关闭,程序A将收到错误ECONNABORTED

你的一个程序关闭了连接,另一个程序不知道它并尝试写入套接字,导致错误。

答案 4 :(得分:0)

本机节点TCP模块可能就是你想要的 - 我想做你想做的事情,但似乎WebSockets严格来说是浏览器到服务器,或浏览器到多服务器。

您可以在您的websocket逻辑中编写tcp策略。

使用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

或者,使用节点模块https://npmjs.org/package/ws-tcp-bridge

我还听说使用redis非常有帮助--Socket.io将此作为后备使用。

希望这会有所帮助......

干杯

答案 5 :(得分:0)

对于希望在MeteorJS应用上执行此操作的任何人,我创建了一个新的Meteor包joncursi:socket-io-client来解决此问题。有关更多详细信息和示例用法,请参阅https://atmospherejs.com/joncursi/socket-io-client。由于我已经将NPM二进制文件捆绑到一个包中,因此您不必担心安装NPM包,声明NPM.require()依赖关系等等。最重要的是,您可以部署到.meteor.com顺手而已。