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.16
和socket.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://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
而无需一个顺利。