0

我无法在 Python 服务器和 JavaScript 客户端之间获得基本的 WebSocket 支持。

在初始握手之后,服务器会发送一些消息来初始化客户端,这些消息看起来工作得很好。这些消息以纯文本形式发送。

客户端以密钥响应。之后,所有进一步的消息在以任何一种方式传输之前都会逐字节地与密钥进行异或。这是在将数据放入服务器端(以及客户端,其中的帧由浏览器处理)的 WebSocket 帧之前完成的。

在这一点上,事情似乎分崩离析。服务器发送大约 10 条长度在 10-25 字节之间的消息,而客户端收到的消息不到一半。此外,客户端收到的内容可能已损坏,因为在 XOR 解码后,它们似乎不是有效消息。

最初我认为这些问题是因为我在 WebSocket 帧而不是二进制中设置了文本操作码,并且 XOR 的字符串不是有效的 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]);
}

有没有人知道为什么我可能不会在客户端收到消息?

4

0 回答 0