以下是代码:
var net = require('net');
var clientList = [];
var chatServer = net.createServer(function(socket){
socket.write("Hi\n");
clientList.push(socket);
socket.setEncoding('utf-8');
socket.on('data', function(data){
for (var i = 0; i < clientList.length; i++) {
clientList[i].write(data);
};
socket.end();
});
}).listen(4000);
当我访问http://127.0.0.1:4000
时,它会给我一些回复:
Hi
GET / HTTP/1.1
Host: localhost:4000
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
但程序崩溃了: 这是控制台的输出:
C:\Users\elqstux\Desktop>node wy.js
events.js:85
throw er; // Unhandled 'error' event
^
Error: This socket has been ended by the other party
at Socket.writeAfterFIN [as write] (net.js:289:12)
at Socket.<anonymous> (C:\Users\elqstux\Desktop\wy.js:13:18)
at Socket.emit (events.js:107:17)
at readableAddChunk (_stream_readable.js:163:16)
at Socket.Readable.push (_stream_readable.js:126:10)
at TCP.onread (net.js:529:20)
我无法理解错误的原因。
答案 0 :(得分:0)
当新客户端连接时,您将传入套接字存储在clientList
阵列中,但是一旦某些数据到达该套接字,您将使用socket.end()
关闭它,但不会删除它来自阵列。因此,当您遍历数组向clientList
数组中的所有套接字发送数据时,您在该列表中的套接字不再打开而产生错误。
Socket.writeAfterFIN
错误表示您在关闭套接字后尝试写入套接字。
这解释了错误。我不确切地知道你要完成什么,所以我不确定要建议什么代码来避免这个错误。
此外,您可以自行处理套接字上的错误(因此您的服务器不会停止):添加:
socket.on('error', function(err) {
// process error here
});
并且,如果客户端关闭套接字,您还需要处理close事件:
socket.on('close', function() {
// clean up references to this socket as it is no longer open
// remove it from the `clientList` array and any other references we have to it
});