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

Schreibe einen Kommentar