WebSocket - 为什么我没有收到我发送的数据?

时间:2013-10-30 10:54:30

标签: javascript python websocket

我在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]);
}

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

0 个答案:

没有答案