【问题标题】:Nodejs Error: This socket has been ended by the other partyNodejs报错:此socket已被对方终止
【发布时间】:2016-04-19 05:06:58
【问题描述】:

我已经设置了一个简单的服务器和客户端,但是每当我关闭客户端时,似乎无法重新连接。这是我的客户:

    const net = require('net');
    var client = net.connect({port: 8080, host: '127.0.0.1'});
    var response = '';
    // events
    client.on('data', function(chunk) { response += chunk });
    client.on('end', function() { 
        console.log(response);
        client.end() 
     });
    // main execution
    client.write('test');

这是我的服务器:

    const net = require('net');
    var server = net.createServer();
    server.listen(8080, '127.0.0.1');
    server.on('connection', function(sock) {
        sock.on('data', function(chunk) {
            sock.write('test received');
            sock.end();
        });
    });

这只是代表我的问题的大纲代码。当我第一次执行我的客户时,一切正常。但是,当我再次执行它时,服务器会输出标题中提到的错误并崩溃。如果我删除 'client.end()' 并从客户端程序中删除 Ctrl+C 以使其结束,也会发生同样的情况。

我对套接字的理解是,它们代表客户端和服务器之间的流中的端点。当不再需要该流时(即,当客户端执行它需要做的事情时),我希望完全删除该流。我认为在该单个流的客户端和服务器端点上调用 end() 可以实现这一点,就像发送两个 FIN 消息一样,但正如所解释的那样,它没有。我想这样做的原因是:(a)客户端文件将实际完成执行,(b)服务器将不再在其系统/浪费资源中监听该流的套接字端点。

对我的问题根源的任何见解将不胜感激。

【问题讨论】:

    标签: node.js sockets


    【解决方案1】:

    您应该在客户端使用“连接”事件,以确保您仅在套接字准备好时才执行请求。所以,在事件的回调中,可以调用write()函数。

    【讨论】:

      【解决方案2】:

      您的服务器仅在收到数据时关闭套接字,而您的客户端从不发送任何数据。

      【讨论】:

      • 在客户端的最后一行,我确实将消息“测试”发送到服务器。
      【解决方案3】:

      你可以在写之前检查socket是否没有被销毁。

      if (!socket.destroyed) socket.write("something");
      

      【讨论】:

        猜你喜欢
        • 2016-06-19
        • 2013-06-20
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-28
        • 1970-01-01
        相关资源
        最近更新 更多