Я работаю над созданием сервера websocket через python (я новичок в python), и я добился значительного прогресса, но я не могу отправлять данные в веб-браузер. Я могу установить соединение и получить данные из браузера, но я не могу отправить обратно данные. Браузер просто игнорирует его. Я бы предположил, что если браузер получил пакет, который не соответствовал спецификациям, он прекратил бы соединение, но соединение останется активным.Websocket: Browser dosn't, похоже, не получает данные с сервера python
Вот метод я использую для кодирования данных в кадре:
def encode_message(data):
frame = "\x81"
size = len(data)
if size * 8 <= 125:
frame += chr(size)
else:
raise Exception("Uh, oh. Strings larger than 125 bits are not supported")
return frame + data
Я посылаю данные, используя sock.sendall(framed_data)
. В чем может быть проблема? Данные для сообщения типа «yo» заканчиваются 10000001 00000010 01111001 01101111
(пробелы добавлены для лучшей читаемости). Почему браузер не принимает такое сообщение? Не соответствует ли это рекомендациям, изложенным в the specification? Я пытаюсь поддержать самую последнюю версию websocket, которая, я считаю, является версией 13. Я использую python версии 2.7.3.
Я попытался посмотреть исходный код библиотек python websocket, но все они, похоже, реализуют устаревшую версию протокола websocket, которая, как было показано, имеет уязвимости.
Вот код, который вызывает функцию выше:
def send(data):
frame = encode_message(data)
print "Sending all..."
sock.sendall(frame) #Socket that handles all communications with client
print "Frame sent :)"
return
я скачал Wireshark нюхать пакеты, пересылаемые между сервером и розеткой. Пакеты, отправленные моим сервером, идентичны пакетам, отправленным с сервера, который принят браузером. Я не видел никакой разницы. (Я посмотрел непосредственно на источник hex)
Так что никто не знает, как это исправить? – CoderOfHonor
Какие обратные вызовы запускаются в вашем браузере? Выполняется ли 'onopen' в конце вашего рукопожатия? Запускаете ли 'onerror' или' onclose' позже? Помните ли вы, что связь открыта после завершения вашего рукопожатия? Если ни один из этих вопросов не поможет вам ответить, можете ли вы опубликовать свой полный серверный источник плюс некоторый простой клиентский код, демонстрирующий проблему? – simonc
'onopen' запускается в конце моего рукопожатия. 'onclose' не запускается до тех пор, пока веб-узел не будет отключен сервером. 'onerror' никогда не вызывается, потому что не возникает ошибка. После установления рукопожатия сервер может получать сообщения от клиента, но обратное не работает. – CoderOfHonor