我正在尝试实现自己的 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编写的,忘记说了。
最佳答案
这与您的其他问题的答案相同: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'
通过在服务器代码中将 send 替换为以下内容,它在 python2.X 中对我有用:
client_socket.send( "".join( [chr(c) for c in formatted_bytes] )
其他一些注意事项:
您链接到的代码将消息长度加 1,这是不正确的。
您确实应该将握手代码与正常的消息解析代码分开。如果有人碰巧发送了一条包含“Sec-WebSocket-Key:”的消息,您最终会通过再次发送原始握手来破坏流。
关于javascript - WebSocket onmessage 未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12304216/