2

我正在尝试实现我自己的 websocket 服务器,并且在 JavaScript 中的 onmessage 函数中遇到了一些麻烦。就是不会火!我在其中设置了一个警报,以便在它被调用时触发,并且警报永远不会出现。我在firefox和chrome上都试过了,都无济于事。

据我所知,我的服务器也在发送正确的消息,当我将其转换为十六进制时,它与此处文档第 5.7 节中的示例完美匹配:

http://datatracker.ietf.org/doc/rfc6455/?include_text=1

所以我不完全确定我做错了什么。握手工作正常,关闭也是如此。这是我当前发送消息的代码:

formatted_bytes = []
formatted_bytes.append( 129 )

message_bytes = bytearray( message )

data_start = 0

if ( len( message_bytes ) <= 125 ):
    formatted_bytes.append( len( message_bytes ) )
    start = 2

for byte in message_bytes:
    formatted_bytes.append( byte )

client_socket.send( bytes( formatted_bytes ) )

服务器是用python写的,忘了说。

4

1 回答 1

4

这与您的其他问题的答案相同:Compressed bit must be 0 when sent a message to websocket client

您的问题是您bytes在 python 2.X 中使用该函数,但希望它能够像在 python 3.X 中那样工作

python2.6.6:

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

蟒蛇3:

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

通过在您的服务器代码中将 send 替换为以下内容,它在 python2.X 中对我有用:

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

其他几点注意事项:

  • 您链接到的代码将消息长度加 1,这是不正确的。

  • 您确实应该将握手代码与正常的消息解析代码分开。如果有人碰巧发送了一条包含“Sec-WebSocket-Key:”的消息,你最终会通过再次发送原始握手来破坏流。

于 2012-09-07T15:44:39.300 回答