2011-05-11 16 views
10

Estoy tratando de crear una prueba usando LearnBoost's socket.io y node-websocket-client. La comunicación entre el cliente y el servidor funciona de maravilla. Después de que se termine toda la comunicación, cierro tanto el cliente como el servidor. Sin embargo, el programa se cuelga, esperando una devolución de llamada desconocida. Dos preguntas:¿Cómo se cierra correctamente socket.io/websocket-client?

  1. ¿Cuál es el siguiente programa en espera?
  2. ¿Existe alguna herramienta para diagnosticar las devoluciones de llamada pendientes en los programas de nodo?

var connect = require('connect'), 
    io = require('socket.io'), 
    WebSocket = require('websocket-client').WebSocket; 

var port = 7111; 

var server = connect.createServer(); 

var socket = io.listen(server); 
socket.on('connection', function(client) { 
    client.send('Welcome!'); 

    client.on('message', function(message) { 
    console.log(message); 
    }); 

    client.on('disconnect', function() { 
    console.log('closing'); 
    server.close(); 
    }); 
}); 

server.listen(port, function() { 
    var ws = new WebSocket('ws://localhost:' + port + '/socket.io/websocket'); 
    ws.onmessage = function(message) { 
    console.log(message.data); 
    }; 

    setTimeout(function() { 
    ws.send('~m~3~m~Yo!'); 
    ws.close(); 
    }, 10); 
}); 

EDIT: cambió el nombre de la variable de la WebSocket a ws para evitar confusiones

+2

Respuesta a la segunda pregunta: No hay herramienta: Consulte http://stackoverflow.com/questions/5916066/node-js-tool-to-see-why-process-is-still-running –

Respuesta

0

El programa está esperando porque socket.io (servidor) todavía está a la escucha para las conexiones entrantes. No sé de ninguna manera para dejar de escuchar.

+0

The socket.io está escuchando conexiones a través del servidor http. La forma correcta de cerrar es cerrar el servidor http. Lo hice en la prueba y el servidor se apaga, pero el programa no se cierra. – Chris

+0

Si comenta el escucha de socket.io, el programa se detendrá en 'server.close()'. – Detect

+0

¿Qué estás comentando? – Chris

5
var socket = io.listen(server); 

Ha creado un socket en un puerto. Nunca lo has cerrado.

socket.server.close() cierra el socket (socket.io).

En caso de duda leer el socket.io github examples

socket.server === server Es el servidor se pasa en, en el estado de la liste por lo que está cerrado. No estoy seguro de lo que está esperando.

+0

Esto es incorrecto. En el ejemplo anterior, cierro el servidor cuando el cliente se desconecta. El ejemplo anterior es básicamente una copia de una de las pruebas anteriores en socket.io, específicamente 'tests/transports.websocket.js'. Parece que Guillermo ha estado cambiando muchas cosas en el maletero, así que verificará su nuevo método de prueba para ver si salen con más elegancia. – Chris

+0

@Chris no se dio cuenta de que 'socket.server' era solo el servidor de conexión. Pensé que era algo diferente. – Raynos

2

Debajo de una forma de cerrar todas las conexiones y poder ejecutar múltiples pruebas expresso (usando socket.io y socket.io-client).

La solución es complicada y con errores, pero funciona en 0.8.5. El problema principal está relacionado con la biblioteca para usar websockets (node-websocket-client).

Actualmente, en socket.io, los colaboradores del sistema operativo han parcheado el websocket client. Por lo tanto, debemos hacer lo mismo en nuestro paquete socket.io-client npm para poder utilizar el método finishClose en el lado del cliente de socket. Socket.io-client usa la biblioteca websocket como paquete npm, por lo que debe encontrar el archivo (websocket.js) y sustituirlo por el mismo en socket.io.

Posteriormente, puede usar el método finishClose para asegurarse de que las conexiones estén cerradas y con algunas configuraciones personalizadas de servidor/cliente, las pruebas se ejecutarán correctamente.

var io = require("socket.io").listen(port); 

    io.set('close timeout', .2); 
    io.set('client store expiration', .2); 

    var client = require("socket.io-client").connect("http://localhost", { port: port , 'reconnect': false, 'force new connection': true}); 

    client.on('connect', function() { 

     client.disconnect(); 

    }); 

    client.on('disconnect', function() { 

     client.socket.transport.websocket.finishClose(); 
     io.server.close(); 

    }); 

    io.server.on('close', function() { 

     setTimeout(function() { 

     done(); 

     }, 500); 
    }); 

Espero, alguien puede ayudar.

+0

esta es la manera correcta de desconectar al cliente, gracias :) – ZiTAL

Cuestiones relacionadas