簡體   English   中英

客戶端關閉選項卡時,Node.js Websocket服務器崩潰

[英]Node.js websocket-server crashes when client closes tab

我有一個運行有一個node.js服務器的示例項目,該服務器用於向客戶端廣播。

服務器處理套接字(來自此人 ):

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

我不知道是否需要在這里刪除套接字,因為套接字關閉的東西似乎可以處理它,但是我還是放下了刪除它的代碼,以防萬一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM