由于缓冲区大小较小,无法通过UDP发送图像C#

由于缓冲区大小较小,无法通过UDP发送图像C#,c#,image,sockets,udp,C#,Image,Sockets,Udp,我正在通过UDP套接字*发送以jpeg格式编码的位图图像。问题是每次图像的大小都是可变的。容器是图像包,它由多个或单个图像和数据包标识符信息组成 服务器端 MemoryStream Ms = new MemoryStream(); bformatter.Serialize(Ms, container); byte[] TestingFlow = Ms.GetBuffer(); ServerSocket.SendTo(TestingFlow, 54000,

我正在通过UDP套接字*发送以jpeg格式编码的位图图像。问题是每次图像的大小都是可变的。容器图像包,它由多个或单个图像和数据包标识符信息组成

服务器端

MemoryStream Ms = new MemoryStream();
bformatter.Serialize(Ms, container);
byte[] TestingFlow = Ms.GetBuffer();
ServerSocket.SendTo(TestingFlow, 54000, 
                    SocketFlags.None, RemoteEndpoint);
byte[] Recievedbytes = UdpListener.Receive(ref RemoteEndPoint);
ImageStream = new MemoryStream(Recievedbytes, 0, Recievedbytes.Length);
imagecontainer = (ImageContainer)bformater.Deserialize(ImageStream);
客户端

MemoryStream Ms = new MemoryStream();
bformatter.Serialize(Ms, container);
byte[] TestingFlow = Ms.GetBuffer();
ServerSocket.SendTo(TestingFlow, 54000, 
                    SocketFlags.None, RemoteEndpoint);
byte[] Recievedbytes = UdpListener.Receive(ref RemoteEndPoint);
ImageStream = new MemoryStream(Recievedbytes, 0, Recievedbytes.Length);
imagecontainer = (ImageContainer)bformater.Deserialize(ImageStream);

我很确定你必须使用

ServerSocket.SendTo(TestingFlow,TestingFlow.Length,
                    SocketFlags.None, RemoteEndpoint);

是否在服务器端使用UDP发送图像文件?不可能

如果你在追求数据完整性,那就忘掉它吧。TCP是更好的协议

UDP用于发送速度问题而非数据完整性问题的小数据包,因此可用于互联网游戏。数据报可能无序到达、被复制或完全消失。UDP没有内在的错误检查或更正。如果需要,这将留给应用程序处理。因此,它的速度超过了可靠性

除非您希望通过重新发送请求和数据报处理来编写所有错误检查(以确保以正确的顺序重新构建文件),否则只需使用TCP over sockets


至少使用TCP,您可以将图像分割成可管理的块,发送它们,并确保安全,因为它们将以正确的顺序到达并完成。

请注意,您可能应该使用
ToArray
而不是
GetBuffer()
,或者在发送时使用
Ms.Length
,否则可能会发送大量不必要的零。我是否应该使用ServerSocket.SendTo(Ms.Buffer(),Ms.Length,SocketFlags.None,RemoteEndPoint)????你可以,是的。另一方面,如果您使用的是UDP,那么在使用大尺寸时需要小心。你真的想自己做任何分块等吗?目前我没有做任何分块。实际上,我对我应该采用哪种机制感到沮丧??任何想法我们都没有足够的信息来说明你为什么要从UDP开始。为什么不直接使用TCP来处理这个问题呢?数组的大小在100KB以上要大得多。那么我该怎么办呢???@Samie:错误是在您第一次运行代码时发生的(服务器端)?你(国际海事组织)应该将文件分小块发送,直到获得完整大小…@Macro:实际上,该机制以前是在TCP上。在TCP中,当我获取映像数据包时,我只需在NetworkStream上使用二进制格式化程序对其进行序列化,在客户端,我只需调用TCP.GetStream获取NS并反序列化以获取映像。在这种情况下,不存在任何问题。现在我无法分割图像数据包,因为我必须在客户端渲染。如果可以分割!!你能告诉我怎么做吗?我使用UDP进行快速通信。由于通信开销引起的轻微抖动可以忽略不计。主要关注的是速度,这就是为什么我正在将基于TCP的通信机制转换为UDPI。建议你增加jpeg压缩,然后降低图像大小。我已经使用压缩流算法对其进行压缩,但大小无法显著减小