【发布时间】:2011-09-09 14:21:17
【问题描述】:
我目前正在使用 WebSockets 和 PHP 服务器:它在 Google Chrome 和 Opera 上运行良好,但不适用于 Firefox 6。
我认为这是由于最后使用的协议版本:我在某处看到它使用第七个版本,而它是用于 Google Chrome 和 Opera 的旧版本。
所以,我修改了我的服务器代码以管理这个新版本:通过使用 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 和其他东西对安全密钥进行哈希处理,Firefox 成功连接。 但如果另一个客户端想要连接(甚至是另一个 Firefox),第一个使用 Firefox 的客户端会自行断开连接。
我看到 socket_recv() 接收到的缓冲区要么是空的,要么是散列的......
所以我决定跳过管理 Firefox 6 使用的协议的想法(互联网上没有文档......!):我认为直接在 JavaScript 中指定要使用的协议会更容易。
在this page 他们说我们可以这样写:
var mySocket = new WebSocket("http://www.example.com/socketserver", "my-custom-protocol");
但是我们应该写什么来代替 "my-custom-protocol" 以使用由 Google Chrome 和 Opera 管理的协议?
提前致谢!
【问题讨论】:
-
有
hybi-00版本,也称为hixie-76,包括两个二进制密钥。还有新的hybi-07,它使用您发布的安全密钥。您必须根据握手 request 的版本生成正确的握手。由于两个版本对键使用不同的标题名称,这应该是可能的。 -
感谢您的回答!所以我尝试了这个:
var mySocket = new WebSocket("http://www.example.com/socketserver", "hybi-00");但 Firefox 发送的标头仍然相同...唯一的区别是现在标头中有 Sec-WebSocket-Protocol: hybi-00 ,但它仍然使用第七版。 -
我想我还没有完全清楚。每个浏览器都发送任一版本,您无法控制它。但是,在服务器上,您可以检查已发送的版本,并做出适当的响应(即正确的握手响应)。
-
哦,我明白了。那么,如果 WebSocket 构造函数的第二个参数在服务器端没有任何改变,那么它的目的是什么?回到我的问题,我认为握手是正确的,因为 Firefox 已连接。只是它收到的消息有奇怪的行为......没关系,我稍后会看到,再次感谢您!
-
老实说,我认为您可以忽略该自定义协议参数。对于消息,在使用
hybi-07发送这些消息方面确实存在巨大 变化。您不能以与hybi-00相同的方式解析它们。它确实支持这种方式的二进制消息传递。我曾经回答过另一个关于此的问题,也许它有帮助:stackoverflow.com/questions/7040078/…。
标签: javascript protocols websocket