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版本发生变化,导致代码也要修改,郁闷,不知道有没有人遇到过。
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);
};
代码解释
-
错误处理:
- 在
sock.on("error", ...)
中添加了错误处理逻辑,这样可以捕获并记录任何与 socket 相关的错误。 - 例如,
sock.on('error', function (err) { ... })
可以帮助捕捉并处理ECONNRESET
错误。
- 在
-
日志记录:
- 添加了日志记录,以便更容易地追踪问题。例如,
logger.info
和logger.error
用于记录信息和错误。
- 添加了日志记录,以便更容易地追踪问题。例如,
-
参数传递:
- 将
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);
在这个示例中:
- 我们添加了一个
error
事件处理器来捕获和处理ECONNRESET
错误。 - 如果发生
ECONNRESET
错误,我们打印一条消息,表示连接被远程客户端重置。 - 对于其他类型的错误,我们同样记录下来以供调试。
通过这种方式,你可以更好地处理不同版本Node.js中的连接关闭和错误情况。