Po pierwsze, nie jestem pewien, dlaczego niektóre serwery Socket.IO nie obsługują gniazd internetowych ... intencją Socket.IO jest ułatwienie tworzenia aplikacji WWW przez przeglądarkę front-end poprzez zapewnienie abstrakcyjny interfejs do strumieni danych w czasie rzeczywistym obsługiwanych przez serwer Socket.IO. Być może Socket.IO nie jest tym, czego powinieneś używać w swojej aplikacji? Poza tym, pozwól mi spróbować odpowiedzieć na twoje pytanie ...
W tym momencie nie ma żadnych bibliotek klienta Socket.IO dla Pythona (gevent-socketio nie jest biblioteką klienta Socket.IO dla Python ... jest to biblioteka Socket.IO serwera dla Pythona). Na razie będziesz musiał połączyć oryginalny kod w celu połączenia się z Socket.IO bezpośrednio jako klient, akceptując różne typy połączeń.
Wiem, że szukasz lekarstwa - wszystko to działa na różnych rodzajach połączeń (WebSocket, długie polling itd.), Ale ponieważ biblioteka taka jak ta jeszcze nie istnieje, mogę przynajmniej dać kilka wskazówek dotyczących korzystania z typu połączenia WebSocket na podstawie mojego doświadczenia.
Dla typu połączenia WebSocket utwórz klienta WebSocket w języku Python. Z wiersza poleceń zainstalować ten pakiet Python websocket Client here z pip tak, że jest na ścieżce Pythona tak:
pip install -e git+https://github.com/liris/websocket-client.git#egg=websocket
Gdy już to zrobisz spróbuj następujące, zastępując SOCKET_IO_HOST
i SOCKET_IO_PORT
z odpowiednim Lokalizacja serwera 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)
w tym momencie masz medium łączenia z serwerem Socket.IO bezpośrednio z poziomu Pythona. Aby wysyłać wiadomości do serwera Socket.IO, wystarczy wysłać wiadomość przez to połączenie WebSocket. Aby serwer Socket.IO poprawnie interpretował przychodzące wiadomości za pośrednictwem tego WebSocket z klienta Python Socket.IO, musisz przestrzegać protokołu Socket.IO i kodować dowolne ciągi lub słowniki, które możesz wysłać przez połączenie WebSocket. Na przykład, po tym, jak osiągnąć wszystko powyżej należy wykonać następujące czynności:
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)
To działa doskonale dla mnie. Dziękuję bardzo za zaktualizowaną odpowiedź! Chciałbym, żeby OP ponownie promował tę, ponieważ rzeczywista odpowiedź (jak zauważysz) nie będzie faktycznie działać z obecną specyfikacją. Wypełniłem resztę kodu dla prostego narzędzia wiersza poleceń, które działa ładnie. Może to być przydatne dla kogoś innego: https://gist.github.com/1402238 Zasadniczo jest to tylko kod z bardzo niewielkimi innymi rzeczami, które są w większości oczywiste, ale mam nadzieję, że to uratuje kogoś kiedyś. – drewww