Python пример веб-сокета Joe's Erlang пример веб-сокета Джо
Вопрос
Я только что работал с примером erlang websockets из Блог Джо Армстронга Я все еще новичок в erlang, поэтому решил написать простой сервер на python, который помог бы мне разобраться с websockets (и, надеюсь, немного с erlang, интерпретируя код Джо).У меня возникли две проблемы:
1) Данные, которые я получаю со страницы, включают 'y' в качестве последнего символа.Это не отображается в версии 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()
Для тех, кто не проходил через пример Джо, но все еще хочет помочь, вам просто нужно подать interact.html через веб-сервер, а затем запустите свой сервер (код предполагает, что веб-сервер запущен на localhost: 8888)
Решение
Для тех, кто заинтересован, это было решение
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 ( веб - сокет ) работаю над Apache в Google code, который я использовал, чтобы выяснить, где я ошибся.
Другие советы
Спасибо, что поделились кодом.Я столкнулся с одной проблемой, запустив этот код в Windows.Что, я думаю, могло бы помочь людям, которые все еще размышляют.
Я сужаю пространство, так что оно становится "Обновленным".:Веб-кошелек'
Убедитесь, что ваша страница хостинга соответствует источнику, которым в данном случае является 'http://localhost:8888'
Сейчас у меня это прекрасно работает.
Eventlet имеет встроенную поддержку websocket, а stargate - это пакет для использования websockets с веб-платформой pyramid: http://boothead.github.com/stargate/