我正在构建一个C#应用程序,使用服务器 - 客户端模型,服务器每50毫秒通过一个套接字向客户端发送一个图像(100kb)......
我使用的是TCP,但除了此协议的开销之外,有时客户端最终在套接字上有多个图像。我仍然没有一个聪明的机制来分割每个图像的字节(实际上,我只需要最新的图像)。
我尝试使用UDP,但得出的结论是我不能发送100kb图表,只能发送64kb图表。即便如此,我不应该使用超过1500字节;否则数据包将沿着网络划分,丢失部分数据包的可能性会更大。
所以现在我有点困惑。我应该继续使用TCP并在每个图像的末尾放置一些转义字节,以便客户端可以将它们分开吗?或者我应该使用UDP,发送1500字节的dgrams并提出一种订购和恢复机制?
这里的关键目标是快速传输图像。只要客户不断接收新的东西,我不介意在途中丢失一些。
或者我应该使用其他协议?提前谢谢!
答案 0 :(得分:15)
您应该考虑使用实时传输协议(又名RTP)。
RTP使用的基础IP协议是UDP,但它有额外的分层来指示时间戳,序列顺序等。
RTP是VoIP和IP视频系统使用的主要媒体传输协议。如果你找不到协议的现有C#实现,我会感到非常惊讶。
此外,如果您的图像文件是JPEG格式,您应该能够生成RTP / MJPEG流。有很多视频查看器已经拥有接收和显示此类流的本机支持,因为某些IP网络摄像头以该格式输出。
答案 1 :(得分:2)
首先,无论你做什么,你的网络都可能无法处理这个问题,但我会选择使用UDP。您可以尝试将图像分割成较小的位,只有在下一个图像到达之前获得所有部分时才显示每个图像。
此外,您可以像其他人提到的那样使用RTP,或者尝试UDT。它是UDP之上相当轻量级的可靠层。它应该比TCP快。
答案 2 :(得分:1)
我建议在以下情况下使用UDP:
如果您正在实施视频会议应用程序,那么值得注意的是,大多数人使用UDP。
否则,您应该使用TCP并实现一种方法来分隔图像。在这方面的一个建议是看看RTP协议。它专为传输VoIP和视频等实时数据而设计。
编辑:我过去曾经多次浏览过.Net RTP库,除了非.Net库的包装或半完成的包装外,我没有取得多大成功。我只是快速看了一眼,这可能是这个ConferenceXP看起来更有希望。
答案 3 :(得分:1)
其他答案涵盖了很好的选择:UDP或像RTP这样的“真实”协议。
但是,如果您想坚持使用TCP,只需构建一个简单的“消息”结构来满足您的需求。最简单的?长度前缀。首先,将图像的长度发送为4个字节,然后发送图像本身。很容易编写客户端和服务器。
答案 4 :(得分:0)
如果最新版本比每张图片都重要,那么UDP应该是您的首选。
但是如果你处理的是超过64K的帧,你必须做一些重新构建你自己的框架。不要担心碎片帧,因为你必须处理它或下层将。而且你只想要完成的图片。
您需要的是具有时间戳/序列的某种形式的封装。