连接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无法关闭的主要内容,如果未能解决你的问题,请参考以下文章

红黑树插入:为啥插入时节点会变成红色?

下载文件时节点渲染过程消失

使用 nvm 时节点在哪里?

为电子安装模块时节点模块版本冲突

计算机重新启动时节点版本重置

如何使用 TLS/SSL 确保 WebSocket 连接的安全