Nodejs:该套接字已关闭。

5
我正在使用Node.js中的TCP套接字与Java客户端通信。
请查看我的非常基本的服务器实现如下:
var server = my_http.createServer();
echo.installHandlers(server, {
    prefix: '/echo'
});
server.listen(8000, '0.0.0.0');

var socketServer = net.createServer(function (socket) {

    // Identify this client
    socket.name = socket.remoteAddress + ":" + socket.remotePort

    // Put this new client in the list
    clients.push(socket);

    sockets[socket.name] = socket;

    // Handle incoming messages from clients.
    socket.on('data', function (data) {

        try {
            var obj = JSON.parse(data);

            if (obj.type == "sendMessage") {
                broadcast("{\"id\":\"1\", \"msg\": \"" + obj.msg + "\", \"name\": \"" + obj.name + "\", \"time\": \"" + getDateTime() + "\"}\n", socket);

            }
        } catch (er) {

        }
    });

    // Remove the client from the list when it leaves
    socket.on('end', function () {
        try {
            clients.splice(clients.indexOf(socket), 1);
        } catch (err) {

        }
    });

    // Send a message 

    function broadcast(message, sender) {
        try {
            clients.forEach(function (client) {
                client.write(message); // ERROR IS HERE
            });
        } catch (ee) {

        }
    }

    return socket;
}).listen(8080);

出现错误的原因是某些情况下会出现以下错误:

events.js:71 throw arguments[1]; // Unhandled 'error' event ^ Error: This socket is closed.

这个错误发生在以下代码行:

client.write(message); // ERROR IS HERE

有什么办法可以防止出现这种情况吗?


套接字是否可能被关闭(监听套接字“close”事件)? - WiredPrairie
1
编程中的套接字编程可能非常令人沮丧,您需要大量地进行错误捕获等操作。 - WiredPrairie
2个回答

7

或者使用 client.writable 来检测套接字是否可用。

    clients.forEach(function (client) {
        try {
            if (client.writable) {
                clientwrite("are u alive");
            } else {
                console.log('client is not writable');
            }
        } catch (err) {
            console.log("cannot send message.");
        }
    }

2

请尝试此代码

选项1

function broadcast(message, sender) {
    try {
        clients.forEach(function (client) {
            if(client._handle){ // ensure there is still underlying handle
               client.write(message); // ERROR IS HERE
            }
        });
    } catch (ee) {

    }
 }

选项2

在套接字上附加错误事件监听器。

Socket.on('error',function(){
   console.log("%j", arguments);

});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接