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) 

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

有什么build议么?

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

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

你可以做服务器到服务器。 “客户端”代码保持不变,就像在浏览器上一样。 令人惊讶的是不是?

我只是自己试了一下,它工作正常..

我运行了两台服务器 – 使用相同的确切代码 – 一次在端口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); } 

如果您在服务器端看到每秒都会打印一个“{我:数据}”,那么一切正常。 只要确保在服务器(端口3000)之后运行客户端(端口3001)。

对于任何search简短工作示例的人,请参见下文。 这个例子适用于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(); } ); } ); 

对于服务器到服务器或应用程序到应用程序的沟通,我认为你应该看看Redis Pub-sub。 它的速度非常好,可以处理大型应用程序的整个消息队列结构。

下面是使用Redis Pub Sub: Redis Pub Sub Example的一个稍微复杂但很容易理解的例子

ECONNABORTED意味着连接已被“对方”closures。

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

你的一个程序已经closures了连接,另外一个程序不知道,并试图写入套接字,导致错误。

本地节点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使用这个作为后备。

希望这可以帮助…

干杯

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