我得到了一个带有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,但没有成功。
我无法想象我是唯一一个遇到此问题的人,但我没有在其他任何地方找到这种确切的行为。
感谢任何帮助!
答案 0 :(得分:0)
我遇到了同样的问题。
这是我的解决方案。我把它放在关闭函数的套接字下面:
socket.on('error', function () {
//Close the socket
});
我不知道套接字是否需要在这里移除,因为套接字关闭的东西似乎处理它,但是为了以防万一我将代码放入其中以便删除它。