3

我正在使用服务器-客户端模型构建一个 C# 应用程序,其中服务器每 50 毫秒通过一个套接字向客户端发送一个图像(100kb)......

我使用的是 TCP,但除了这个协议的开销之外,有时客户端会在套接字上获得多个图像。而且我还没有一个聪明的机制来分割每个图像的字节(实际上,我只需要最近的一个)。

我尝试使用 UDP,但得出的结论是我不能发送 100kb 的 dgram,只能发送 64kb 的。即便如此,我也不应该使用超过 1500 字节;否则数据包将沿着网络被分割,并且丢失部分数据包的机会会更大。

所以现在我有点困惑。我应该继续使用 TCP 并在每个图像的末尾放置一些转义字节,以便客户端可以将它们分开吗?或者我应该使用 UDP,发送 1500 字节的 dgram,并提出一种排序和恢复机制?

这里的关键目标是非常快速地传输图像。只要客户不断收到更新的,我不介意在途中丢失一些。

或者我应该使用其他协议吗?提前致谢!

4

5 回答 5

15

您应该考虑使用实时传输协议(又名RTP)。

RTP 使用的底层 IP 协议是 UDP,但它有额外的分层来指示时间戳、序列顺序等。

RTP 是 VoIP 和 IP 视频系统使用的主要媒体传输协议。如果您找不到该协议的现有 C# 实现,我会感到非常惊讶。

此外,如果您的图像文件是 JPEG 格式,您应该能够生成 RTP/MJPEG 流。由于某些 IP 网络摄像头以这种格式输出,因此有相当多的视频查看器已经原生支持接收和显示此类流。

于 2009-04-15T23:11:18.170 回答
2

首先,无论您做什么,您的网络都可能无法处理此问题,但我会使用 UDP。您可以尝试将图像拆分为更小的位,并且仅在下一张图像到达之前获得所有部分时才显示每张图像。

此外,您可以像其他人提到的那样使用 RTP ,或者尝试UDT。它是 UDP 之上的一个相当轻量级的可靠层。它应该比 TCP 更快。

于 2009-04-15T23:16:50.293 回答
1

如果出现以下情况,我建议使用 UDP:

  • 您的应用程序可以处理无法通过的图像或少量图像,
  • 您可以将图像压缩到 65535 字节。

如果您正在实施视频会议应用程序,那么值得注意的是大多数使用 UDP。

否则,您应该使用 TCP 并实施一种方法来分隔图像。在这方面的一个建议是看一下RTP协议。它专门设计用于传输实时数据,例如 VoIP 和视频。

编辑:我过去曾多次环顾.Net RTP 库,除了非.Net 库的包装器或半完成的库外,我没有取得太大的成功。我只是又快速浏览了一下,这可能是这个ConferenceXP看起来更有希望的一个。

于 2009-04-15T23:14:29.410 回答
1

其他答案涵盖了很好的选择:UDP或像RTP这样的“真实”协议。

但是,如果您想坚持使用 TCP,只需为自己构建一个简单的“消息”结构来满足您的需求。最简单的?长度前缀。首先,发送图像的长度为 4 个字节,然后发送图像本身。很容易编写客户端和服务器。

于 2009-04-15T23:18:14.270 回答
0

如果最新的比每张图片都重要,UDP 应该是你的首选。

但是,如果您正在处理大于 64K 的帧,则必须做某种形式的重新构图。不要担心碎片帧,因为你必须处理它,否则下层会。你只想要完整的图片。

您需要的是某种形式的时间戳/序列封装。

于 2009-04-15T23:13:24.373 回答