Пример Python примера Erlang websocket Joe

Я просто работал через erlang websockets пример из блога Joe Armstrong, я все еще довольно плохо знаком с erlang, таким образом, я решил записать простой сервер в Python, который поможет учить меня websockets (и надо надеяться некоторый erlang путем интерпретации кода joe). У меня есть две проблемы:

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

2) Я, кажется, отправляю данные из сервера (через websocket) - который может быть подтвержден путем взгляда на то, сколько байтов 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()

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

9
задан Jonas 18 December 2011 в 01:26
поделиться

2 ответа

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

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:

Вы можете просмотреть разницу файла здесь . По сути, моя проблема заключалась в том, как я был декодированием / кодировкой строк до отправки / получения. Есть модуль WebSocket .

10
ответ дан 3 November 2019 в 01:56
поделиться

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

  1. Я сократил пробел, так что получилось 'Upgrade: WebSocket'

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

Теперь у меня все работает отлично.

0
ответ дан 3 November 2019 в 01:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: