javascript - 客户端关闭选项卡时,Node.js websocket-server 崩溃

标签 javascript node.js websocket crash server

我有一个使用 node.js 服务器运行的小示例项目,该服务器用于向客户端广播。

处理套接字的服务器(来自 this guy ):

var ws = require('websocket.io');
var url = require("url");
var http = require('http').createServer(onRequest).listen(3000);
var clients = [];
var server = ws.attach(http, { path: '/mywebsocket' });

server.on('connection', function (socket) {
    clients.push(socket);
    console.log('new client');
    socket.on('message', function (msg) {
        console.log("msg recv: " + JSON.stringify(msg));
    });
    socket.on('close', function () {
        console.log('client leaving ');
        clients.splice(clients.indexOf(this), 1);
    });
});

function onRequest(request, response) {
    var urlobj = url.parse(request.url, true);
    if (urlobj.query.activity) {
        var actObj = JSON.parse(urlobj.query.activity);
        if (actObj) {
            clients.forEach(function(client) {
                var msg = JSON.stringify(actObj);
                client.send(msg);
                console.log("NODE sending " + msg);
            });
        }
    }
    response.end();
}

小样本页面:
<script type="text/javascript">
    var node_ws = new WebSocket("ws://" + "localhost" + ":" + "3000" + "/mywebsocket");

    node_ws.onmessage = function (evt) {
        var msg = JSON.parse(evt.data);
        var action = msg.action;

        var para = document.createElement("p");
        var node = document.createTextNode(action);
        para.appendChild(node);

        var element = document.getElementById("div1");
        element.appendChild(para);
    };

</script>
<div id="div1">Test</div>

设置工作正常,将数据推送到客户端并在网站上显示。当客户端通过单击另一个链接离开时,服务器只记录客户端离开。当客户端通过关闭浏览器中的选项卡(在本例中为 Chrome)离开时,运行在 Node.js 上的服务器崩溃并显示以下错误消息:
events.js:141
throw er; // Unhandled 'error' event
^
Error: read ECONNRESET
at exports.errnoException (util.js:860:11)
at TCP.onread (net.js:544:26)

我尝试捕捉使用 onbeforeunload 关闭并关闭客户端 Websocket 的事件,但没有成功。这

我无法想象我是唯一一个遇到这个问题的人,但我在其他任何地方都没有找到这种确切的行为。

任何帮助表示赞赏!

最佳答案

我有同样的问题。

这是我的解决方案。我把它放在关闭功能的套接字下面:

socket.on('error', function () {        
    //Close the socket
    });

我不知道是否需要在此处删除套接字,因为套接字关闭的东西似乎可以处理它,但我还是将代码放入删除它以防万一。

关于javascript - 客户端关闭选项卡时,Node.js websocket-server 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33655047/

相关文章:

javascript - 隐藏/显示具有相同 id 的多个 li 内容

javascript - 验证 JS 代码的 API/库/工具?

javascript - Promise 链如何断言哪个值来自哪个返回值?

javascript - NodeJS 创建 JWT 无第三方库

javascript - javascript 获取什么样的属性?

javascript - 具有从 到 的随机唯一数字的数组 js

node.js - Twitter API 问题(代码 : 349, 消息 : 'You cannot send messages to this user.' ) in node. js

javascript - Python WebSocket 不工作

websocket - 如何使用 Strimzi Kafka Bridge 作为流媒体服务

django - 使用 django channel 和 celery 收听 mqtt 主题