example - Formatage des messages à envoyer au serveur socket.io node.js à partir du client python



socket io server (2)

J'essaye d'obtenir un client de Python parlant à un serveur de Node.js using Socket.io 0.7, en envoyant un événement fait sur commande au serveur.

Basé sur la référence Socket.io que j'ai trouvée sur GitHub et la bibliothèque WebSocket Python suivante.

Voici mon code jusqu'à présent:

Serveur de noeud

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

Client 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()

Sortie de la console de noeud

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 

Sortie de la console Python

Done
1::
6:::1
Closing connection

Maintenant, il semble que l'événement socket ne soit pas déclenché, malgré le fait que le serveur répond avec ACK. Donc, le message est correctement reçu mais je suppose, pas formaté correctement pour socket.io pour déclencher un événement.

Je ne pensais pas que le cadrage était nécessaire, mais Archie1986 semble être en désaccord sur sa réponse à ceci: Socket.IO Client Library en Python

Que pourrais-je faire de mal ici?

https://src-bin.com


Answer #1

Résolu. J'avais besoin d'utiliser des guillemets doubles. Les guillemets simples ne sont pas valides JSON. Woops.

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

Devient:

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

Answer #2

J'ai enveloppé la recherche de tige dans une bibliothèque de client de barebones socket.io .

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




socket.io