0

Testing node httpServer and webSocketServer(ws)

Trying to implement a http-ws server that will close after a client is connected as illustrated below:

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);
*/

I uploaded the full test project. https://github.com/kenokabe/http-ws-test

HTTPserver.close(); works just as expected without ws client connections.

HTTPserver.close(); does not work (fails to close) with ws client connections.

Any idea what is going on and how to fix this issue? Thanks.

**PS. Please note that what I need to close is

NOT only ws connections but also httpServer.

I need to open and close whole frequently.

The reason to close httpServer is that the project is for plugin, and need to shut down httpServer in a specific case.**

UPDATE

I modified the code to close webSocketServer before httpServer, but still httpServer is alive.

  • you did not webSocketServer.close() – wayne Mar 11 '14 at 06:57
  • 1
    You need to understand what `close` does. Read these - http://nodejs.org/api/net.html#net_server_close_callback http://stackoverflow.com/questions/5263716/graceful-shutdown-of-a-node-js-http-server – vinayr Mar 11 '14 at 07:17
  • Thanks. I modified the code. Although I understand the idea and have done closing the webSocketServer and then httpServer, it still there. Any idea? –  Mar 11 '14 at 07:41

1 Answers1

0

I updated my gitHub

https://github.com/kenokabe/http-ws-test

Finding How do I shutdown a Node.js http(s) server immediately?

Force close all connections in a node.js http server

connection->socket needs to be destroyed for each.

For my sample code, I use ES6 observe method.

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);
Community
  • 1
  • 1