La création d'un WebSocket Client en Python

Je suis en train d'apprendre sur socket de programmation ainsi que le protocole WebSocket. Je sais qu'il y a python web socket clients dans l'existence, mais je suis l'espoir de construire un jouet version pour mon propre apprentissage. Pour ce faire j'ai créé une extrêmement simple Tornade serveur websocket que je suis en cours d'exécution sur localhost:8888. Tout ce qu'il fait est d'imprimer un message lorsqu'un client se connecte.

C'est l'ensemble du serveur et ça fonctionne (j'ai testé avec un petit script javascript dans mon navigateur)

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

Donc, une fois que je démarre le serveur j'essaie d'exécuter le script suivant

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)

Ce que j'espère, c'est que le serveur va envoyer l'en-tête de réponse, comme spécifié dans la RFC. Au lieu de la chaussette.recv est suspendu. Cela m'amène à croire que le serveur n'est pas en reconnaissant les websocket poignée de main initiale. Cette poignée de main est tiré hors de la RFC. Je sais que le websocket clé doit être aléatoire et tout et tout, mais je ne pense pas que causerait le serveur d'ignorer la poignée de main (le websocket clé est valide). Je pense que je peux comprendre le reste une fois que je peux lancer la poignée de main donc j'espère qu'il y a une certaine incompréhension dans les websockets travail ou comment envoyer de la première handhake.

OriginalL'auteur Bear | 2013-06-08