Nodejs 0.8.20 和0.10.14版本的socket问题

Nodejs 0.8.20 和0.10.14版本的socket问题

exports.createLocalServer = function (port) { PORT = port;

var server = net.createServer(function (sock) {


   
    logger.info('CONNECTED: ' +
        sock.remoteAddress + ':' + sock.remotePort);


    sock.on("data", function (data) {
      
      //do something
     
    });


    sock.on("close", function (data) {

        logger.info('CLOSED: ' +
            sock.remoteAddress + ' ' + sock.remotePort);
    });


}).listen(PORT, HOST);

server.on("listening", function () {
    logger.info("server listening:" + server.address().port);
});


server.on("error", function (exception) {
    logger.error("server error:" + exception);
});

}

这是服务端代码,node版本0.8.20当客户端关闭连接后,服务端响应sock.on(“close”)事件没问题。 当我用node 0.10.14版本时候出现如下错误:events.js:72 throw error; Error: read ECONNRESET at errorExecption(net.js:901:11) at TCP.onread(net.js:556:19); 添加解决方法 sock.on(“close”, function (data) {

        logger.info('CLOSED: ' +
            sock.remoteAddress + ' ' + sock.remotePort);
    });

nodejs版本发生变化,导致代码也要修改,郁闷,不知道有没有人遇到过。


4 回复

Node.js 0.8.20 和 0.10.14 版本的 socket 问题

问题描述

在使用 Node.js 0.8.20 版本时,当客户端关闭连接后,服务端能够正确地响应 sock.on("close") 事件。然而,在升级到 Node.js 0.10.14 版本后,同样的代码却抛出了一个错误:

events.js:72
throw er; // Unhandled 'error' event
^
Error: read ECONNRESET
    at exports._errnoException (util.js:746:11)
    at TCP.onread (net.js:557:26)

解决方案

在 Node.js 0.10.14 版本中,你需要确保在处理 socket 连接时正确处理错误事件。以下是修改后的代码示例:

var net = require('net');
var logger = require('some-logger'); // 假设你有一个日志库

exports.createLocalServer = function (port, host) {
    var PORT = port;
    var HOST = host;

    var server = net.createServer(function (sock) {
        logger.info('CONNECTED: ' +
            sock.remoteAddress + ':' + sock.remotePort);

        // 监听错误事件
        sock.on('error', function (err) {
            logger.error('SOCKET ERROR: ' + err.message);
        });

        sock.on("data", function (data) {
            // do something with data
        });

        sock.on("close", function () {
            logger.info('CLOSED: ' +
                sock.remoteAddress + ' ' + sock.remotePort);
        });
    });

    server.on("listening", function () {
        logger.info("server listening on " + server.address().port);
    });

    server.on("error", function (exception) {
        logger.error("server error: " + exception);
    });

    server.listen(PORT, HOST);
};

代码解释

  1. 错误处理

    • sock.on("error", ...) 中添加了错误处理逻辑,这样可以捕获并记录任何与 socket 相关的错误。
    • 例如,sock.on('error', function (err) { ... }) 可以帮助捕捉并处理 ECONNRESET 错误。
  2. 日志记录

    • 添加了日志记录,以便更容易地追踪问题。例如,logger.infologger.error 用于记录信息和错误。
  3. 参数传递

    • host 参数传递给 createLocalServer 函数,使代码更灵活。

通过这些修改,即使在 Node.js 0.10.14 版本中,你的代码也能正确处理客户端关闭连接的情况,并且不会因为未处理的错误而崩溃。


node.js在不断完善中,特别是socket这块,好消息是走在正确的道路上

坏消息是有可能更新版本后,代码出现异常。

在Node.js的不同版本中,Socket的行为可能会有所不同,特别是在处理连接关闭事件方面。在你的例子中,ECONNRESET 错误通常表示远程客户端已经重置了连接。这可能是因为客户端突然断开连接或网络问题。

在Node.js 0.10.14中,处理 ECONNRESET 错误可以通过监听 error 事件来实现。以下是改进后的代码示例:

var net = require('net');
var PORT = 3000;
var HOST = 'localhost';

var server = net.createServer(function (sock) {
    console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);

    sock.on("data", function (data) {
        // do something
    });

    sock.on("close", function () {
        console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort);
    });

    sock.on("error", function (err) {
        if (err.code === "ECONNRESET") {
            console.log('Connection reset by peer:', err);
        } else {
            console.error('Socket error:', err);
        }
    });
});

server.on("listening", function () {
    console.log("server listening on " + server.address().port);
});

server.on("error", function (exception) {
    console.error("server error:", exception);
});

server.listen(PORT, HOST);

在这个示例中:

  1. 我们添加了一个 error 事件处理器来捕获和处理 ECONNRESET 错误。
  2. 如果发生 ECONNRESET 错误,我们打印一条消息,表示连接被远程客户端重置。
  3. 对于其他类型的错误,我们同样记录下来以供调试。

通过这种方式,你可以更好地处理不同版本Node.js中的连接关闭和错误情况。

回到顶部