JavaScript 和 WebSockets:使用特定协议

Posted

技术标签:

【中文标题】JavaScript 和 WebSockets:使用特定协议【英文标题】:JavaScript and WebSockets: using specific protocol 【发布时间】: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 相同的方式解析它们。它确实支持这种方式的二进制消息传递。我曾经回答过另一个关于此的问题,也许它有帮助:***.com/questions/7040078/…。 【参考方案1】:

WebSocket 构造函数的协议选项实际上是一个“子协议”(通常以该名称调用),它是一个应用程序级别的子协议。它对实际的 WebSocket 协议版本没有任何影响。浏览器基本上支持 WebSocket 协议本身的单一版本。大多数服务器支持多个版本的协议。

Firefox 6.0 引入了对新 HyBi 系列协议的支持(HyBi-00 实际上只是 Hixie-76 协议的副本)。 HyBi 版本为数据引入了一种新的框架格式,而不仅仅是对握手的改变。 Chrome 14 也使用了新的 HyBi 协议系列。

这里是最新版本的 WebSockets 协议:https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-14 虽然 firefox 6.0 实际上是这个https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-07,但实际上并没有太多真正的变化(主要是规范本身的文本变化)。

您确定 firefox 连接成功(即您确实在浏览器中获得了 onopen 事件)吗?

【讨论】:

感谢这些澄清!我确实收到了一个 onopen 事件,这就是为什么我认为问题来自发送消息的方式(并且 pimvdb 已确认 ^^)。我已经下载并使用 Google Chrome 14 进行了测试,并且出现了同样的问题......现在管理 WebSockets 似乎很难,我想我会使用 Node.js 或其他东西^^' 你可能想看看Socket.IO,它是一个在 Node.js 上运行并处理会话管理的 WebSocket 层(如果 WebSockets 不受浏览器)。 @KorHosik,如果您认为这充分回答了您的问题,请不要忘记为后面的人选择一个答案(当然还有声誉;-))。 Socket.IO 似乎很有趣,我会看到的。谢谢! =)

以上是关于JavaScript 和 WebSockets:使用特定协议的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 和 WebSockets:使用特定协议

docker上带有javascript和nginx的websockets

Azure 服务总线通知中心是不是与 websockets 和 javascript 一起使用?

通过 websockets 使用 javascript 传输文件

使用 javascript 和 websockets 显示来自 blob 的图像

使用 Openfire、Javascript (strophe.js) 和 html5 websockets 的聊天客户端?