2012-09-06 5 views
1

Я пишу сервер websocket в python, и я столкнулся с проблемой при отправке сообщений обратно клиенту. Использование консоли JavaScript Chrome, я могу получить как найти это сообщение об ошибке:Сжатый бит должен быть 0 при отправке сообщения клиенту websocket

Сжатый бит должен быть равен 0, если нет переговоров выкачивает рамки расширения

Но дальше, чем я не могу найти документация о том, что это на самом деле означает. Вы можете найти начало этой проблемы (и код) here. Я немного растерялся. Я попытался сыграть с первым байтом, изменив его на все 0, но согласно this, второй бит, который равен 0 в моем случае, должен быть «сжатым», если this документация верна;

«Один зарезервированный бит RSV1 в кадре WebSocket заголовка выделяется для управления применением сжатия для каждого сообщения.»

Так что я не совсем уверен, куда идти отсюда. В firefox ошибка - это просто «Соединение с ws: // localhost: 8080/было прервано во время загрузки страницы». ошибка.

EDIT: Вот синтаксический анализ код при получении сообщения:

def parse(self, data, client_socket): 
    display_server_message("Received message:\n%s" % str(data)) 
    byte_array = bytearray(data) 
    mask = [] 

    message_string = "" 
    for i in range(0, len(byte_array)): 
     b = byte_array[ i ] 
     if i > 0 and i < 2: 
      b = b & 0b01111111 
     if i > 1 and i < 6: 
      mask.append(byte_array[ i ]) 
     if i > 5: 
      b = b^mask[ (i - 2) % 4 ] 
      message_string = message_string + chr(b) 

    display_server_message("Decoded Message:\n%s" % message_string) 
    if (message_string == "a test message"): 
     time.sleep(5) 
     self.send_message("Hello, how are you?", client_socket) 


    pat = re.compile("Sec-WebSocket-Key: (\S+)", re.MULTILINE) 

    for match in pat.findall(data): 
     magic_string = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 

     message = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: %s\r\n\r\n" % base64.standard_b64encode(hashlib.sha1(match + magic_string).digest()) 

     client_socket.send(message) 
     display_server_message("Message Sent:\n%s" % message) 
+1

Можете ли вы либо отправить полный код на свой сервер, либо захватить проводной проводник/tcpdump. Либо нужно четко указывать на проблему. – kanaka

+0

@kanaka добавил код разбора/заголовка –

+0

Полный исполняемый код (для пастигинга github gist) - это то, что мне нужно (чтобы я мог запустить его и быстро рассказать вам, что не так). Или захват wirehark, который позволит мне точно увидеть, что не так с сообщением. – kanaka

ответ

2

Это тот же ответ, как и для другого вопроса: WebSocket onmessage not firing

Ты проблема заключается в том, что вы используете bytes функция в Python 2.x, но ожидая, что она работает так, как это делает в питона 3.X

python2.6.6:

>>> bytes([129, 19]) 
'[129, 19]' 

питон 3:

>>> bytes([129, 19]) 
b'\x81\x13' 

Заменяя отправить следующее в коде сервера он работает для меня в python2.X:

client_socket.send("".join([chr(c) for c in formatted_bytes]) 

Несколько других примечаний:

  • Код, к которому вы присоединились, добавляет 1 к неправильной длины сообщения.

  • Вы действительно должны иметь код рукопожатия отдельно от обычного кода разбора сообщений. Если кто-то случайно отправил сообщение, содержащее «Sec-WebSocket-Key:», вы в конечном итоге повредили бы поток, отправив необработанное рукопожатие обратно.

+0

Я бы просто вычислил часть формата сам, расстраивая ... в любом случае, фактическая проблема заключалась, как вы сказали, в добавлении 1, потому что браузер все еще ожидал другого байта. Очень расстраивает! Благодаря тонну! Я отвечу на оба ответа правильно. –

Смежные вопросы