Пример Python из примера веб-сокета Джо Эрланга - PullRequest
9 голосов
/ 28 января 2010

Я только что работал над примером erlang websockets из в блоге Джо Армстронга Я все еще новичок в erlang, поэтому я решил написать простой сервер на python, который помог бы научить меня веб-сокетам ( и, надеюсь, немного эрланга, интерпретируя код Джо). У меня две проблемы:

1) Данные, которые я получаю со страницы, включают 'ÿ' в качестве последнего символа. Это не отображается в версии erlang, и я не могу понять, откуда она взялась Исправлено - Это было потому, что строки были закодированы в utf-8, а я не декодировал их

2) Я, кажется, отправляю данные с сервера (через веб-сокет) - что можно проверить, посмотрев, сколько байтов делает client.send (). Но ничего не появляется на странице. Исправлено, я неправильно кодировал строку

Я положил весь код здесь . Вот моя версия на 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 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 = client.recv(255)
    print shake
    client.send(our_handshake)

def interact(client, tick):
    data = client.recv(255)
    print 'got:%s' %(data)
    client.send("clock ! tick%d\r" % (tick))
    client.send("out ! recv\r")

if __name__ == '__main__':
    start_server()

Для тех, кто не пробежал по примеру Джо, но все еще хочет помочь, вам просто нужно открыть файл connect.html через веб-сервер, а затем запустить свой сервер (код предполагает, что веб-сервер работает на localhost: 8888)

Ответы [ 3 ]

10 голосов
/ 28 января 2010

Для тех, кто заинтересован, это было решение

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

Изменить для запроса liwp:

Вы можете просмотреть diff файла здесь . По сути, моей проблемой было то, как я декодировал / кодировал строки перед отправкой / получением. Есть модуль веб-сокета , над которым Apache работает над кодом Google, который я использовал, чтобы выяснить, где я ошибался.

0 голосов
/ 18 января 2011

Eventlet имеет встроенную поддержку веб-сокетов, и stargate представляет собой пакет для использования веб-сокетов с веб-фреймворком пирамиды: http://boothead.github.com/stargate/

0 голосов
/ 08 августа 2010

Спасибо, что поделились кодом. Я столкнулся с одной проблемой при запуске этого кода в Windows. Который, я думаю, может помочь людям, которые все еще фигурируют.

  1. Я сжимаю пространство, чтобы оно стало "Upgrade: WebSocket"

  2. Убедитесь, что ваша страница хостинга соответствует источнику, который в данном случае равен 'http://localhost:8888'

Теперь это прекрасно работает для меня.

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