2011-07-14 11 views
19

Estoy intentando que un cliente Python hable con un servidor Node.js usando Socket.io 0.7, enviando un evento personalizado al servidor.Formateo de mensajes para enviar al servidor socket.io node.js desde el cliente python

Basado en la referencia Socket.io que he encontrado en GitHub, y en la siguiente WebSocket Python library.

He aquí es mi código hasta ahora:

servidor Nodo

io.sockets.on('connection', function (socket) { 
    socket.on('newimg', function(data) { 
     console.log(data); 
    }); 
}); 
cliente

Python

def handshake(host, port): 
    u = urlopen("http://%s:%d/socket.io/1/" % (host, port)) 
    if u.getcode() == 200: 
     response = u.readline() 
     (sid, hbtimeout, ctimeout, supported) = response.split(":") 
     supportedlist = supported.split(",") 
     if "websocket" in supportedlist: 
      return (sid, hbtimeout, ctimeout) 
     else: 
      raise TransportException() 
    else: 
     raise InvalidResponseException() 


try: 
    (sid, hbtimeout, ctimeout) = handshake(HOSTNAME, PORT) #handshaking according to socket.io spec. 
Except Exception as e: 
    print e 
    sys.exit(1) 
ws = websocket.create_connection("ws://%s:%d/socket.io/1/websocket/%s" % (HOSTNAME, PORT, sid)) 
print ws.recv() 
ws.send("2::") 
ws.send("5:1::{'name':'newimg', 'args':'bla'}") 
print ws.recv() 
print "Closing connection" 
ws.close() 

salida de la consola Nodo

debug - client authorized 
info - handshake authorized 12738935571241622933 
debug - setting request GET /socket.io/1/websocket/12738935571241622933 
debug - set heartbeat interval for client 12738935571241622933 
debug - client authorized for 
debug - websocket writing 1:: 
debug - websocket received data packet 2:: 
debug - got heartbeat packet 
debug - websocket received data packet 5:1::{'name':'newimg', 'args':'bla'} 
debug - acknowledging packet automatically 
debug - websocket writing 6:::1 
info - transport end 
debug - set close timeout for client 12738935571241622933 
debug - cleared close timeout for client 12738935571241622933 
debug - cleared heartbeat interval for client 12738935571241622933 
debug - discarding transport 

consola de Python salida

Done 
1:: 
6:::1 
Closing connection 

ahora parece que el evento conector no está siendo activado, a pesar de que el servidor responde con ACK. Por lo tanto, el mensaje se está recibiendo correctamente, pero asumo que no tiene el formato adecuado para que socket.io active un evento.

No pensé que enmarca era necesario, sin embargo Archie1986 parece no estar de acuerdo en su respuesta a esto: Socket.IO Client Library in Python

¿Qué podría estar haciendo mal aquí?

+1

Resuelto. Aceptaré mi propia respuesta tan pronto como se me permita hacerlo. El problema estaba en utilizar comillas simples, en vez de dobles para JSON. – rod

Respuesta

14

Resuelto. Necesitaba usar comillas dobles Las comillas simples no son válidas JSON. Woops.

ws.send("5:1::{'name':'newimg', 'args':'bla'}") 

se convierte en:

ws.send('5:1::{"name":"newimg", "args":"bla"}') 
20

envolví rod 's investigación en un barebones socket.io client library.

pip install -U socketIO-client 
python 
    from socketIO_client import SocketIO 
    with SocketIO('localhost', 8000) as socketIO: 
     socketIO.emit('aaa') 
     socketIO.wait(seconds=1) 
+0

¿Qué hace socketIO.wait? es seconds = 1 a timeout? – lmc

Cuestiones relacionadas