【问题标题】:Unable to send binary data over WebSockets无法通过 WebSockets 发送二进制数据
【发布时间】:2012-11-16 01:38:46
【问题描述】:

我正在开发一个查看器应用程序,其中服务器捕获图像,执行一些图像处理操作,这需要在 HTML5 画布上显示在客户端。我写的服务器是用VC++编写的,使用http://www.codeproject.com/Articles/371188/A-Cplusplus-Websocket-server-for-realtime-interact

到目前为止,我已经实现了所需的功能。现在我需要做的就是优化。 Reference 是一个用于发送字符串的聊天应用程序,因此我将数据编码为 7 位格式。这导致开销。我需要二进制数据传输能力。所以我修改了编码和框架(现在操作码是 130,二进制消息而不是 129。)我可以说服务器部分没问题。我观察了传出帧,它遵循协议。我在客户端遇到问题。

每当客户端收到传入消息时,如果所有字节都在限制范围内(0 到 127),它会调用 onMessage(),我可以成功解码传入消息。然而,即使是一个大于 127 的字符的引入也会导致客户端调用 onClose()。连接关闭,我无法找到原因。请帮帮我。

PS:我使用的是 chrome 22.0 和 Firefox 17.0

【问题讨论】:

  • 我面临同样的问题。你能解决这个问题吗?

标签: c++ websocket server-push


【解决方案1】:

您的问题似乎与您组装框架的方式有关?由于您有一个已建立的连接,当 onmessage 事件即将触发时终止,我认为它与框架相关?

如果你研究网络 -> WebSocket -> 谷歌浏览器的连接框架怎么办?它说了什么?

它可能超出了您的范围?但我是 XSockets.NET (C#) 框架的开发人员之一,我们在那里提供二进制支持,如果您有兴趣,我恰好发布了一个示例最近可以在https://github.com/MagnusThor/XSockets.Binary.Controller.Example找到它

【讨论】:

  • 其实我不这么认为。该代码是为传输文本帧而编写的。一个数据包需要 8kB。如果我仅使用 7 位对其进行编码,(没有字节可以高于 0x7F)一切都按预期运行。我只是在发送二进制数据时进行了一项更改,即我将操作码从 0x01(文本帧)更改为 0x02(二进制帧)。在客户端为了测试我只是在我的 OnMessage() 中写一个警报。如果是二进制消息,则永远不会调用 OnMessage。它转到 socket.OnClose() 并关闭连接。
【解决方案2】:

您如何观察传出帧以及您观察到的标头字节是什么?听起来您实际上可能没有成功设置二进制操作码,这会在浏览器中触发 UTF-8 验证失败。

【讨论】:

  • 当数据被构图时,我通过步进 Visual Studio 观察到它。我会尽快尝试在此处添加确切的帧数据序列,以便调试。
  • 您可以尝试使用wireshark进行捕获,这样您就可以看到网络上的实际数据。
猜你喜欢
  • 2012-12-05
  • 2014-11-30
  • 2013-09-18
  • 2013-03-07
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多