有人读过希克森2010年5月的草案-hixie-thewebsocketprotocol-76websocket protocol吗?
以下是.htm文件的源:

<html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <script type="text/javascript">
        var socket = new WebSocket('ws://localhost:8181/websession');
        socket.onopen = function() {
            alert('handshake successfully established. May send data now...');
        };
        socket.onclose = function() {
            alert('connection closed');
        };
    </script>
</head>
<body>
</body>
</html>

如果我有一个监听8181的TCP端口,这是我在Chrome中加载上面的.htm文件时得到的请求:
GET /websession HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: localhost:8181
Origin: null
[\n]

(其中,[\n]是CRLF字符。)
我该怎么做才能回到这个握手开场白呢?Draft-Hixie-TheWebSocketProtocol-76显示:
HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://example.com
Sec-WebSocket-Location: ws://example.com/demo
Sec-WebSocket-Protocol: sample

8jKS'y:G*Co,Wxa-

但此响应会导致socket.onclose触发。

最佳答案

草案76将WebSocket-响应头重命名为Sec-WebSocket-,并添加了一些不必要的丑陋的Key头和请求主体加密内容,其中8jKS'y:G*Co,Wxa-是响应。但这只是对草案中包含的示例的正确响应;对于任何其他请求返回该特定字符串都不好。有关如何实现新协议的说明,请参阅this post
在任何情况下,除非您使用最新的开发版本,否则chrome/chromium仍将使用旧的75草案协议(正如您发布的请求所展示的那样),并且不会与实现新协议的服务器通信。有关更多信息,请参阅Chromium blog。如果需要支持旧的/当前的Chrome版本,则必须有效地实现两个WebSocket协议。
这始终是根据尚未标准化的协议开发产品的风险。在WebSocket完成之前,您可以期待烦人的互操作性;您可能更喜欢推迟到那时。
(试图实际阅读规范,并找出大量不可读的解析算法中到底发生了什么变化,这是一个令人沮丧的练习。我不知道为什么它是这样写的,而不是像通常的BNF风格规范那样的RFC。就好像hixie用C语言编写了一个解析器,然后编写了一个自动工具将代码转换为英语。c的可读性更高,tbh)。

关于html5 - HTML5:最新的WebSockets,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3139578/

10-10 12:29