Python WebSocket не работает - PullRequest
       7

Python WebSocket не работает

0 голосов
/ 29 января 2012

Я попытался реализовать свой первый пример с веб-сокетом, но не могу заставить его работать.

Я использую веб-сервер Python:

import threading
import socket

def start_server():
    tick = 0
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('localhost', 1234))
    sock.listen(100)
    while True:
        print 'listening...'
        csock, address = sock.accept()
        tick+=1
        print 'connection!' 
        handshake(csock, tick)
        print 'handshaken'
        while True:
            interact(csock, tick)
            tick+=1


def send_data(client, str):
     #_write(request, '\x00' + message.encode('utf-8') + '\xff')
     str = '\x00' + str.encode('utf-8') + '\xff'
     return client.send(str)

def recv_data(client, count):
    data = client.recv(count)    
    return data.decode('utf-8', 'ignore')

def handshake(client, tick):
     our_handshake = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"+"Upgrade:         WebSocket\r\n"+"Connection: Upgrade\r\n"+"WebSocket-Origin: http://localhost:8888\r\n"+"WebSocket-Location: "+" ws://localhost:1234/websession\r\n\r\n"
     shake = recv_data(client, 255)
     print shake
     #We want to send this without any encoding
     client.send(our_handshake)

 def interact(client, tick):
     data = recv_data(client, 255)
     print 'got:%s' %(data)
     send_data(client, "clock ! tick%d" % (tick))
     send_data(client, "out ! %s" %(data))

 if __name__ == '__main__':
     start_server()

И HTML:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Web Socket Example</title>
    <meta charset="UTF-8">
    <script>
      window.onload = function() {
        var s = new WebSocket("ws://localhost:1234/");
        s.onopen = function(e) { s.send('Ping'); }
        s.onmessage = function(e) { alert("got: " + e.data); }
        s.onclose = function(e) { alert("closed"); }
      };
    </script>
    </head>
    <body>
      <div id="holder" style="width:600px; height:300px"></div>
    </body>
 </html>

Когда я указываю своему браузеру http://localhost/websocket.html через apache2

, я получаю следующую ошибку:

python websocketserver.py
listening...
connection!
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:1234
Origin: http://localhost
Sec-WebSocket-Key: A4sVkUhjVlTZbJrp2NUrqg==
Sec-WebSocket-Version: 13


handshaken
got:
Traceback (most recent call last):
  File "websocketserver.py", line 43, in <module>
    start_server()
  File "websocketserver.py", line 17, in start_server
    interact(csock, tick)
  File "websocketserver.py", line 40, in interact
    send_data(client, "out ! %s" %(data))
  File "websocketserver.py", line 24, in send_data
    return client.send(str)
socket.error: [Errno 32] Broken pipe

Может кто-нибудь помочь мне исправить это?

Спасибо

1 Ответ

3 голосов
/ 30 января 2012

Вы отвечаете более старым протоколом Hixie 75, но клиент говорит только по более новому протоколу HyBi / IETF RFC 6455 WebSocket.

Ваш ответ на рукопожатие должен выглядеть примерно так (значение подтверждения вычисляется из значения ключа от клиента):

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

В HyBi / 6455 кадры больше не разделены символами \ x00 и \ xff. Вместо этого есть заголовок для каждого кадра, который содержит несколько частей данных, включая тип кадра и длину полезной нагрузки.

См. spec для получения дополнительной информации. Или, что еще лучше, вы можете сослаться и / или использовать существующую реализацию Python WebSocket, такую ​​как pywebsocket , tornado , или мой собственный проект websockify , который содержит websocket.py который является общим сервером веб-сокетов lib.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...