使用nodejs编写聊天服务器时如何处理此错误?

时间:2015-05-12 07:35:07

标签: node.js

以下是代码:

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)

我无法理解错误的原因。

1 个答案:

答案 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
});