【问题标题】:Socket.io: Connect from one server to anotherSocket.io:从一台服务器连接到另一台服务器
【发布时间】:2023-03-23 05:45:01
【问题描述】:

我正在尝试使 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)

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

有什么建议吗?

【问题讨论】:

  • “second_server_host”会发生什么?它是否正确接受连接?它会过早关闭连接吗?你检查关闭的连接吗?
  • 是的,抱歉,日志来自“第二个”服务器。它接受连接,因此正在调用连接回调io.sockets.on('connection', connection_callback ),但是当我尝试对某些事件(即socket.on('server_to_server_command', command_callback))设置回调时,它会失败,并带有上面的错误日志(ECONNABORTED)。我只是想我根本不应该在服务器上使用 socket.io-client,必须有一种方法可以正确地进行这些服务器间通信..
  • 好的,最近好像修复了,这里是线程groups.google.com/group/socket_io/browse_thread/thread/…
  • 请考虑接受答案

标签: node.js socket.io


【解决方案1】:

刚刚遇到了这个问题,还有一个类似的问题,答案要好得多。

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)。

【讨论】:

  • 这一定是缺少创建此应用程序对象的第一行吗?
  • 是的。这超出了这个问题的范围。您可以使用快速生成器npm -g install express 然后express 快​​速生成此代码。您可能可以在线找到复制粘贴示例。这很容易
【解决方案2】:

对于搜索简短工作示例的任何人,请参阅下文。此示例适用于 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();
    } );
} );

【讨论】:

    【解决方案3】:

    对于服务器到服务器或应用程序到应用程序的通信,我认为您应该研究 Redis Pub-sub。它的速度非常快,可以处理大型应用程序的整个消息队列架构。

    这是一个使用 Redis Pub Sub 的稍微复杂但完全可以理解的示例: Redis Pub Sub Example

    【讨论】:

    • 这属于评论——这是一个建议,而不是一个答案
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

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

        您可以将 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

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

        我还听说使用 redis 很有帮助 - Socket.io 将其用作后备。

        希望这会有所帮助...

        干杯

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-05
          • 2017-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多