我正在尝试实现自己的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编写的,忘了提及。
答案 0 :(得分:4)
这与您的其他问题的答案相同:Compressed bit must be 0 when sending a message to websocket client
你的问题是你在python 2.X中使用bytes
函数,但期望它在python 3.X中的工作方式
python2.6.6:
>>> bytes([129, 19])
'[129, 19]'
python 3:
>>> bytes([129, 19])
b'\x81\x13'
通过在服务器代码中使用以下内容替换发送,它在python2.X中适用于我:
client_socket.send( "".join( [chr(c) for c in formatted_bytes] )
其他几点说明:
您链接的代码是在消息长度上加1,这是不正确的。
您应该将握手代码与正常的消息解析代码分开。如果有人碰巧发送了包含“Sec-WebSocket-Key:”的消息,你最终会再次发回原始握手来破坏流。