我正在尝试使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)
我想我做错了,错过了一些明显的东西。
有什么建议吗?
答案 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.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();
} );
} );
答案 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://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
顺手而已。