【问题标题】:Nodejs TCP socket, when ending, does not contain remoteAddress informationNodejs TCP socket,结束时不包含remoteAddress信息
【发布时间】:2012-06-21 06:21:51
【问题描述】:

我正在构建一个简单的 echo 服务器,目的是学习有关使用 node.js 构建 tcp 服务的基础知识并找出可用的信息。

当我创建服务器时,如下图所示,我可以访问有关incomingSocket 的信息,例如远程地址。为什么我无法访问有关关闭套接字的信息?以下是我的代码;我的评论表明我收到的输出。

var net = require ( 'net' );
var server = net.createServer (
    function ( incomingSocket )
    {
        //'connection' listener
        console.log ( 'Connection from ' + incomingSocket.remoteAddress + ':' + incomingSocket.remotePort + " established." );

        incomingSocket.on (
            'data' ,
            function ( data )
            {
                // The incomingSocket.remoteAddress is defined here
                console.log ( incomingSocket.remoteAddress + ':' + incomingSocket.remotePort + ' -> ' + data.toString () );
            }
        );

        incomingSocket.on (
            'close' ,
            function ()
            {
                // The incomingSocket.remoteAddress is undefined here
                console.log ( 'connection from ' + incomingSocket.remoteAddress + ' closed.' );
            }
        );
        incomingSocket.pipe ( incomingSocket );
    }
);
// listening to a port happens here

我将不胜感激!谢谢!

【问题讨论】:

    标签: sockets node.js tcp


    【解决方案1】:

    不,因为当它进入套接字关闭事件的事件处理程序时,套接字对象不再存在。如果您需要在套接字关闭时显示客户端的远程地址,只需在客户端初始连接时存储远程地址即可。

    var clients = new Array();
    
    net.createServer(function(socket) {
       var remoteAddress = socket.remoteAddress;
       var remotePort = socket.remotePort;
    
       // Add to array of clients
       clients.push(remoteAddress + ':' + remotePort);
    
       console.log('Connection from ' + remoteAddress  + ':' + remotePort + " established.");
    
       socket.on('data', function(data) {
          console.log(remoteAddress + ':' + remotePort + ' -> ' + data.toString());
       });
    
       socket.on('close', function() {
          // Remove from array of clients
          clients.splice(clients.indexOf(remoteAddress + ':' + remotePort), 1);
    
          console.log('Connection from ' + remoteAddress + ':' + remotePort + ' closed.');
       });
    
       ...
    

    【讨论】:

    • 感谢您的回复;我想学习如何在 node.js 上使用 tcp 服务器,所以我开始着手制作一个简单的聊天室服务器。每次建立新连接时,我都会将一个添加存储到当前存在的连接列表中,当来自一个连接的数据通过时,我通过所有其他连接发送它。我需要做的是删除断开连接的连接,为此,我需要知道它们的端口和地址,以便我可以将其从连接列表中删除。我将如何尝试解决这个问题?
    • 取决于您如何存储远程地址和端口。我要做的是在它们连接时将它们的组合添加到数组中,并在套接字关闭时将它们从数组中删除。该数组必须在function(socket) {闭包中可访问的范围内定义。
    • 我就是这么做的。当它关闭时从数组中删除套接字时,变量套接字不存储任何内容。
    • 我已经更新了我的答案以向您展示我的意思。您将远程地址和端口保存到变量中,即使套接字关闭,您也可以使用它们。
    • 啊哈!太感谢了!我现在明白了!您将其存储在本地!谢谢你:D
    猜你喜欢
    • 2013-05-20
    • 2019-04-06
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 2012-03-13
    • 2014-11-05
    • 2011-01-20
    • 2018-06-24
    相关资源
    最近更新 更多