我用Node.js构建了一个简单的TCP服务器和客户端。
现在,当客户端向服务器发送“exit”时,连接会成功关闭。服务器从其套接字列表中删除套接字,并向客户端发送“Bye bye!”。
客户端上的连接也关闭了,但应用程序仍在等待其他输入,因此它不会停止运行,我被迫输入CTRL+C。
我尝试在连接关闭后添加process.exit()
,但它并没有起作用:
客户端代码:
var net = require('net'),
config = require(__dirname + '/config.json'),
connection = net.createConnection(config.port, config.host);
connection.setEncoding('utf8');
connection.on('connect', function () {
console.log('Connected');
});
connection.on('error', function (err) {
console.error(err);
});
connection.on('data', function (data) {
console.log('» ' + data);
});
connection.on('close', function() {
console.log('Connection closed');
});
process.stdin.on('data', function (data) {
if ((new String(data)).toLowerCase() === 'exit') {
connection.end();
process.exit();
}
else {
connection.write(data);
}
});
process.stdin.resume();
服务器代码:
var server = require('net').createServer(),
config = require(__dirname + '/config.json'),
sockets = [];
server.on('connection', function (socket) {
socket.setEncoding('UTF-8');
socket.on('data', function (data) {
console.log('Received data: ' + data);
if (data.trim().toLowerCase() === 'exit') {
socket.write("Bye bye!\n");
socket.end();
}
else {
sockets.forEach(function (client) {
if (client && client != socket) {
client.write(data);
}
});
}
});
socket.on('close', function () {
console.log('Connection closed');
sockets.splice(sockets.indexOf(socket), 1);
console.info('Sockets connected: ' + sockets.length);
});
sockets.push(socket);
});
server.on('listening', function () {
console.log('Server listening');
});
server.on('close', function () {
console.log('Server is now closed');
});
server.on('error', function (err) {
console.log('error:', err);
});
server.listen(config.port);
编辑:
我添加了一个客户端连接的“关闭”事件处理程序。因此,服务器和客户端现在都会打印字符串“连接已关闭”。
connection.destroy()
方法,但在我的应用程序中结果是相同的。它关闭连接,就像connection.end()
一样。关键是在连接关闭后进程仍在运行,只有在connection.end()
或connection.destroy()
之后调用process.exit()
才能给我所需的行为。请阅读我的答案。您必须将process.exit()
放在connection.on('close')
事件处理程序中,以便在连接关闭(或销毁)后执行。在命令行上尝试我的代码。 - Francesco Casulaend()
时,close
事件不会立即触发。它会在套接字实际关闭后被调用,例如,在end()
之后,服务器会发送bye
(这是服务器的+1个数据包),或者在destroy()
之后立即强制断开连接。一旦套接字关闭,在close
事件处理程序中,没有必要使用process.exit()
,因为这是进程将在您的示例中执行的最后一件事情。 - esengineerprocess.exit()
指令,否则客户端不会关闭,你必须按下 CTRL+C 快捷键才能在 shell 上输入。这是问题所在,只有process.exit()
指令可以修复我发布的代码中的这种行为。如果你找到了其他方法来解决我的应用程序中的这个特定行为,请发布出来。connection.destroy()
无法解决我的挂起行为。我已经尝试过了。 - Francesco Casula