Prima di tutto, non sono sicuro del perché alcuni dei server Socket.IO non supportano i websocket ... l'intento di Socket.IO è quello di semplificare lo sviluppo del browser front-end delle app Web fornendo un interfaccia astratta ai flussi di dati in tempo reale serviti dal server Socket.IO. Forse Socket.IO non è quello che dovresti usare per la tua applicazione? A parte questo, vorrei provare a rispondere alla tua domanda ...
A questo punto nel tempo, non ci sono librerie client Socket.IO per Python (gevent-socketio non è un Socket.IO cliente libreria per Python ... è una libreria Socket.IO per Python). Per ora, dovrai mettere insieme del codice originale per interfacciarlo con Socket.IO direttamente come client mentre accetti vari tipi di connessione.
So che stai cercando una cura, tutto ciò che funziona attraverso vari tipi di connessione (WebSocket, polling lungo, ecc.), Ma dal momento che una libreria come questa non esiste ancora, posso almeno dare alcune indicazioni sull'utilizzo del tipo di connessione WebSocket in base alla mia esperienza.
Per il tipo di connessione WebSocket, creare un client WebSocket in Python. Dalla riga di comando installare questo pacchetto client Python WebSocket here con pip in modo che sia il vostro percorso pitone in questo modo:
pip install -e git+https://github.com/liris/websocket-client.git#egg=websocket
Una volta fatto che provare la seguente, sostituendo SOCKET_IO_HOST
e SOCKET_IO_PORT
con l'appropriato posizione del server Socket.IO:
import websocket
SOCKET_IO_HOST = "127.0.0.1"
SOCKET_IO_PORT = 8080
socket_io_url = 'ws://' + SOCKET_IO_HOST + ':' + str(SOCKET_IO_PORT) + '/socket.io/websocket'
ws = websocket.create_connection(socket_io_url)
a questo punto si ha una media di interfacciarsi con un server Socket.IO direttamente da Python. Per inviare messaggi al server Socket.IO è sufficiente inviare un messaggio attraverso questa connessione WebSocket. Affinché il server Socket.IO interpreti correttamente i messaggi in arrivo tramite questo WebSocket dal client Python Socket.IO, è necessario rispettare il protocollo Socket.IO e codificare qualsiasi stringa o dizionario che è possibile inviare tramite la connessione WebSocket. Ad esempio, dopo aver compiuto tutto sopra effettuare le seguenti operazioni:
def encode_for_socketio(message):
"""
Encode 'message' string or dictionary to be able
to be transported via a Python WebSocket client to
a Socket.IO server (which is capable of receiving
WebSocket communications). This method taken from
gevent-socketio.
"""
MSG_FRAME = "~m~"
HEARTBEAT_FRAME = "~h~"
JSON_FRAME = "~j~"
if isinstance(message, basestring):
encoded_msg = message
elif isinstance(message, (object, dict)):
return encode_for_socketio(JSON_FRAME + json.dumps(message))
else:
raise ValueError("Can't encode message.")
return MSG_FRAME + str(len(encoded_msg)) + MSG_FRAME + encoded_msg
msg = "Hello, world!"
msg = encode_for_socketio(msg)
ws.send(msg)
Funziona alla grande per me. Grazie mille per la risposta aggiornata! Vorrei che l'OP lo riprendesse di nuovo, perché la risposta reale (come lei indica) non funzionerà effettivamente con le specifiche attuali. Ho compilato il resto del codice per un semplice strumento da riga di comando che funziona bene. Potrebbe essere utile a qualcun altro: https://gist.github.com/1402238 Fondamentalmente è solo il tuo codice con alcune cose molto minori che sono per lo più ovvi, ma spero che salverà qualcuno qualche volta. – drewww