连接webSocket客户端时节点httpServer无法关闭
Posted
技术标签:
【中文标题】连接webSocket客户端时节点httpServer无法关闭【英文标题】:node httpServer fails to close when webSocket client is connected 【发布时间】:2014-03-11 06:36:52 【问题描述】:测试节点httpServer和webSocketServer(ws)
尝试实现一个http-ws服务器,在客户端连接后会关闭,如下图所示:
var HTTPserver =
httpServer(require('path')
.join(__dirname, 'www'));
HTTPserver
.on('listening', function()
console.log('HTTP listening:');
//---------------
var WebSocket = require('ws');
var webSocketServer =
new WebSocket.Server(
server: HTTPserver
);
webSocketServer
.on('connection',
function(ws)
console.log('client connected');
setTimeout(function()
console.log('trying to close webSocketserver');
webSocketServer.close();
setTimeout(function()
console.log('trying to close HTTPserver');
HTTPserver.close();
, 1000);
, 1000);
);
)
.on('close', function()
console.log('server closed'); // never happens
)
.on('error', function()
console.log('server error');
)
.listen(8000);
// this works when no Client Connection
/*
setTimeout(function()
HTTPserver.close();
, 3000);
*/
我上传了完整的测试项目。 https://github.com/kenokabe/http-ws-test
HTTPserver.close();
在没有ws
客户端连接的情况下按预期工作。
HTTPserver.close();
无法与ws
客户端连接一起工作(无法关闭)。
知道发生了什么以及如何解决此问题吗?谢谢。
**PS。请注意,我需要关闭的是
不仅有ws
连接,还有httpServer。
我需要经常打开和关闭整体。
关闭httpServer的原因是该项目是插件的,具体情况需要关闭httpServer。**
更新
我修改了代码,在httpServer之前关闭了webSocketServer,但是httpServer仍然存在。
【问题讨论】:
你没有 webSocketServer.close() 您需要了解close
的作用。阅读这些 - nodejs.org/api/net.html#net_server_close_callback ***.com/questions/5263716/…
谢谢。我修改了代码。虽然我理解这个想法并且已经关闭了 webSocketServer,然后关闭了 httpServer,但它仍然存在。有什么想法吗?
【参考方案1】:
我更新了我的 gitHub
https://github.com/kenokabe/http-ws-test
发现 How do I shutdown a Node.js http(s) server immediately?
Force close all connections in a node.js http server
connection->每个socket都需要销毁。
对于我的示例代码,我使用ES6 observe
方法。
http://wiki.ecmascript.org/doku.php?id=harmony:observe#object.observe http://wiki.ecmascript.org/doku.php?id=harmony:observe_api_usage
https://github.com/jdarling/Object.observe
var IO =
terminate:
val: false
;
var trigger = function(obj)
obj.val = !obj.val;
;
var HTTPserver =
httpServer(require('path')
.join(__dirname, 'www'));
var webSocketServer;
HTTPserver
.on('listening', function()
console.log('HTTP listening:');
//---------------
var WebSocket = require('ws');
webSocketServer =
new WebSocket.Server(
server: HTTPserver
)
.on('connection',
function(ws)
console.log('client connected');
);
)
.on('close', function()
console.log('server closed'); // never happens
)
.on('error', function()
console.log('server error');
)
.on('connection', function(socket)
console.log('connection');
Object.observe(IO.terminate, function(changes)
console.log('now!2');
socket.destroy();
);
)
.listen(8000);
setTimeout(function()
console.log('now');
HTTPserver.close();
webSocketServer.close();
trigger(IO.terminate);
, 15000);
【讨论】:
以上是关于连接webSocket客户端时节点httpServer无法关闭的主要内容,如果未能解决你的问题,请参考以下文章