我正在寻找一种通过 Internet 传输数据的好方法,并且我在 C++/windows 环境中工作。数据是二进制的,是提取图像的压缩 blob。输入和要求如下:
- 6kB/包@10 包/秒(60kBytes/秒)
- 可靠的数据传输
我是网络编程的新手,到目前为止,我可以发现以下方法之一是合适的。
- 插座
- MSMQ(MS 消息队列)
客户端在浏览器上运行(在浏览器上显示实时图像)。当服务器运行本机 C++ 代码时。请让我知道是否有任何其他方法可以实现相同的目标?我应该去哪一个,为什么?
我正在寻找一种通过 Internet 传输数据的好方法,并且我在 C++/windows 环境中工作。数据是二进制的,是提取图像的压缩 blob。输入和要求如下:
我是网络编程的新手,到目前为止,我可以发现以下方法之一是合适的。
客户端在浏览器上运行(在浏览器上显示实时图像)。当服务器运行本机 C++ 代码时。请让我知道是否有任何其他方法可以实现相同的目标?我应该去哪一个,为什么?
如果服务器确定发送图像的速度,这就是它的样子,那么服务器推送式解决方案将是有意义的。如今,大多数浏览器(甚至非浏览器)正在适应的是WebSockets。
WebSockets 相对于大多数专有协议的主要优势,除了成为广泛采用的标准外,还在于它们运行在 HTTP 之上,因此可以渗透(大多数)代理和防火墙等。
在服务器端,您可能会集成node.js,它允许您轻松实现 WebSockets,并附带许多其他库。它是用 C++ 编写的,并且可以通过 C++ 和 JavaScript 进行扩展,node.js 为其托管一个 VM。node.js 的主要特点是在每个级别都是异步的,这使得这种编程风格成为默认。
但是当然还有其他方法可以在服务器端实现 WebSockets,也许 node.js 比你需要的更多。我已经在 Windows 上为 node.js 实现了一个 C++ 扩展,并使用socket.io为旧版浏览器执行 WebSocket 和非 WebSocket 传输,这对我来说效果很好。
但那是文本数据。在您的二进制数据案例中,socket.io 不会这样做,因此您可以查看其他通过 WebSockets 执行二进制的库。
是否有任何特定原因导致您无法在 Windows 机器上运行服务器?60kb/秒,看起来像某种嵌入式设备?
根据我们的描述,您需要在浏览器上实时显示图像信息。您可以使用 HTTP。但它是无状态的,这意味着一旦信息被传输,你就会失去连接。您的客户端需要轮询 C++/Windows 机器。如果您非常确信生成的信息是周期性的,您可以使用这种方法。这需要一个服务器,所以只有在我的第一个问题是肯定的情况下
聊天协议。类似于在您的客户端上运行的 Jabber 客户端,以及在您的 C++/Windows 机器上运行的 Jabber 服务器。聊天协议允许几乎实时
虽然这似乎有道理,但在这种情况下我不会使用 MSMQ。您现在可能不会遇到问题,但是 MSMQ 消息的大小是有限的,您最终可能会因此而碰壁。
我会在这个应用程序中使用 TCP,TCP 的构建考虑了可靠性,您可以简单地通过套接字提供数据。您可能必须自己找出一个非常简单的协议,但它应该是最佳选择。
除非您使用的是开箱即用的理解 MSMQ 的嵌入式设备,否则使用 MSMQ 的最佳选择是使用代理,然后您仍然被迫使用 TCP 和可能的 HTTP。
我在个人时间进行家庭自动化,包括安全摄像头,我使用 .net 微框架,即使它确实具有 MSMQ 功能,我仍然不会使用它。
我建议您查看 MJPEG(Motion JPEG),这听起来与您想做的完全一样。
http://www.codeproject.com/Articles/371955/Motion-JPEG-Streaming-Server