Erstellen eines WebSocket-Client in Python
Ich versuche zu lernen, über socket-Programmierung, als auch das WebSocket-Protokoll. Ich weiß, dass es python-web-socket-clients in der Existenz, aber ich bin der Hoffnung zu bauen, eine Spielzeug-version für mein eigenes lernen. Um dies zu tun, die ich erstellt habe eine extrem einfache Tornado websocket-server, der läuft bei mir auf localhost:8888
. Alle es tut, ist eine Nachricht drucken, wenn ein client eine Verbindung herstellt.
Dies ist die gesamte server - und es funktioniert (habe es getestet mit einem kleinen javascript-Skript in meinem browser)
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
class WSHandler(tornado.websocket.WebSocketHandler):
def open(self):
print('new connection')
self.write_message("Hello World")
def on_message(self, message):
print('message received %s' % message)
def on_close(self):
print('connection closed')
application = tornado.web.Application([
(r'/ws', WSHandler),
])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
So, sobald ich starten Sie den server, ich versuche, führen Sie das folgende Skript
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((socket.gethostbyname('localhost'), 8888))
msg = '''GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13'''.encode('ascii')
print(len(msg))
sent_count = sock.send(msg)
print('sent this many bytes:', sent_count)
recv_value = sock.recv(1)
print('recvieved:', recv_value)
Was ich hoffe ist, dass der server schickt die Antwort-header-Angaben in der RFC. Statt der Socke."recv" - Vorgang bleibt hängen. Dies führt mich zu glauben, dass die server nicht die Anerkennung der websocket-handshake. Dieser handshake ist, zog der RFC als gut. Ich weiß, dass das websocket-Schlüssel sollte zufällig sein und alles, aber ich glaube nicht, dass dazu führen würde, dass die server ignorieren den handshake (der websocket-key gültig ist). Ich denke, ich kann herausfinden, den rest aus, sobald ich einleiten kann, der Handschlag, so bin ich der Hoffnung, dass es nur ein Missverständnis, entweder, wie websockets funktionieren oder wie Sie zum senden der ersten handhake.
InformationsquelleAutor Bear | 2013-06-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
1) Beim senden einer Nachricht über ein socket, Sie haben keine Ahnung, wie viele Stücke es wird unterteilt werden. Es können alle kommen auf einmal gesendet; oder die ersten 3 Buchstaben gesendet werden kann, dann wird der rest der Nachricht, oder die Nachricht kann aufgeteilt werden in 10 Stücke.
2) 1) wie ist der server kennen soll, wenn alle die Stücke, die vom client gesendet? Zum Beispiel, angenommen, der Server erhält 1 Stück die Botschaft des Kunden. Wie funktioniert der server wissen, ob das war die ganze Meldung, oder ob es weitere 9 Stücke kommt?
3) ich schlage vor, Sie Lesen dies:
http://docs.python.org/2/howto/sockets.html
(Plus die links in den Kommentaren)
4) Nun, warum bist du nicht mit python zum erstellen eines HTTP server?
Python ist3:
python2:
Den SimpleHTTPRequestHandler bietet die Dateien aus der server-Programm-Verzeichnis und unten, passend zu den request-url, um die Verzeichnis-Struktur erstellen. Wenn Sie die Anfrage '/', wird der server dienen, bis ein index.html Datei aus dem gleichen Verzeichnis, der server ist im. Hier ist ein Beispiel für eine client-socket-für python 3 (python-2-Beispiel unten):
In python 3, Sie haben die Verwendung von byte-Ketten mit buchsen, da sonst der gefürchtete:
Hier ist eine python-2.x:
Beachten Sie, dass der header des GET-Anfragen teilt dem server mit, dass HTTP 1.1 wird das Protokoll, d.h. die Regeln für das Gespräch. Und als die RFC für HTTP 1.1 beschrieben, gibt es zwei '\r\n' Sequenzen in der Anfrage. Also der server ist auf der Suche für das zweite '\r\n' - Sequenz. Wenn Sie das löschen von einem der '\r\n' - Sequenzen aus der Anforderung, die der client hängt die recv (), da der server wartet immer noch auf weitere Daten, da die server noch nicht gelesen hat, der zweite '\r\n' - Sequenz.
Beachten Sie auch, dass Sie senden werden die Daten als bytes(in python 3), so gibt es nicht für jedes automatische '\n' umgewandelt werden, die der server erwartet die Sequenz '\r\n'.
Okay, jetzt sind Sie auf etwas. Ist der server erwartet ein 0x00 byte mit signal am Ende der Nachricht? Oder ist der server erwartet, um zu sehen, "ENDE DER NACHRICHT"? Oder ein newline? Jedes dieser Regime ist bekannt als - Protokoll, und Sie haben eine Vereinbarung über das Protokoll Voraus, so dass ein socket und einem server wissen, wie Sie miteinander reden. Lesen Sie den link, den ich gepostet.
Ja hatte ich gepostet, dass, bevor Sie Ihren link. Aber was Sie sagt macht Sinn. Was ich tun müssen, ist lassen Sie den server wissen, dass meine Botschaft ist vorbei, also kann es verarbeiten/reagieren. Ich bin in der Mitte zu Lesen, das HOWTO jetzt also hoffentlich, dass bringt mich auf die richtige Spur.
Weiter Lesen: 1) Die definition des HTTP-request: w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5. Beachten Sie, dass die definition der Request-Line umfasst ein CRLF ("\r\n "für alle OS' s ) am Ende der Zeile. Neben der Allgemeinen Anforderung definition Bedarf weiterer CRLF, die kommen können, nachdem alle Header, falls vorhanden. 2) Ein Beispiel für ein python-client-socket-Verbindung zu einem http-server: binarytides.com/python-socket-programming-tutorial
Ich werde Lesen Sie jede dieser Ressourcen. Sie sind definitiv das, was ich suchte, und hofft, zu lernen mehr über (meine Netzwerke Klasse nahm ich war völlig wertlos und überhaupt nicht mit über das). Die "http" - Teil wird helfen, zu sehen, wie ein Programm funktioniert und auszubauen.
InformationsquelleAutor 7stud