要每50毫秒发送一次图像,我应该使用TCP还是UDP?

时间:2009-04-15 23:06:52

标签: c# image tcp udp

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

我使用的是TCP,但除了此协议的开销之外,有时客户端最终在套接字上有多个图像。我仍然没有一个聪明的机制来分割每个图像的字节(实际上,我只需要最新的图像)。

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

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

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

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

5 个答案:

答案 0 :(得分:15)

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

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

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

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

答案 1 :(得分:2)

首先,无论你做什么,你的网络都可能无法处理这个问题,但我会选择使用UDP。您可以尝试将图像分割成较小的位,只有在下一个图像到达之前获得所有部分时才显示每个图像。

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

答案 2 :(得分:1)

我建议在以下情况下使用UDP:

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

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

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

如果最新版本比每张图片都重要,那么UDP应该是您的首选。

但是如果你处理的是超过64K的帧,你必须做一些重新构建你自己的框架。不要担心碎片帧,因为你必须处理它或下层将。而且你只想要完成的图片。

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