我在Python服务器和JavaScript客户端之间无法获得基本的WebSocket支持。
在初始握手之后,服务器发送一些消息来初始化似乎正常工作的客户端。这些消息以纯文本形式发送。
客户端用密钥响应。在此之后,所有其他消息在以任一方式传输之前逐个字节地对着密钥进行XOR&#d。这是在将数据放入服务器端的WebSocket框架(以及浏览器处理框架的客户端)之前完成的。
此时,事情似乎崩溃了。服务器发送大约10条消息的突发,长度在10-25字节之间,客户端接收的消息少于一半。此外,客户收到的内容可能已损坏,因为在XOR解码后,它们似乎不是有效的消息。
最初我认为这些问题是因为我在WebSocket框架中设置了Text操作码而不是Binary,并且XOR< dd字符串不是有效的UTF-8字符。我现在使用二进制操作码仍然存在这个问题。
我在这里包含了我代码中最相关的部分。我希望有人可以指出一个错误,或者我忽略的东西。我浏览过WebSocket规范,但我只对实现应用程序的最基本消息传递感兴趣。
服务器:
def send_data(self, data):
data = struct.pack('H', len(data)) + xor_encode(data, ENCODE_KEY)
data = self.encode_websocket_data(data)
self.send(data) // writes it to the socket
def encode_websocket_data(self, data):
header = [chr(130)]
length = len(data)
if length <= 125:
header.append(chr(length))
else:
header.append(chr(126))
header.append(chr((length >> 8) & 255))
header.append(chr(length & 255))
msg = ''.join(header) + data
return msg
在客户端,我收到的是:
...
reader = new FileReader();
reader.addEventListener("loadend", this.process_input.bind(this));
...
// bound to socket onmessage, data = event.data
recv: function(data) {
reader.readAsArrayBuffer(data);
}
// processes the input
process_input: function() {
var bytes = new Int8Array(reader.result);
var lines = [];
while (bytes.length > 0) {
var size = (bytes[0] & 0xff) + (bytes[1] & 0xff) * 256;
bytes = bytes.subarray(2);
if (size <= bytes.length) {
var line = bytes_to_str(bytes.subarray(0, size));
lines.push(line);
bytes = bytes.subarray(size);
}
else {
// error
break;
}
}
for (n in lines)
if (lines[n].length)
this.recv_callback(lines[n]);
}
有没有人知道为什么我可能不会在客户端收到消息?