C#套接字,接收大文件

本文关键字:文件 套接字 | 更新日期: 2023-09-27 18:24:12

我现在正在使用asyn套接字。我有一个回调函数"onDataReceived",每当我收到任何数据时都会触发它。

首先,我一次只得到一个字符,所以我将socketPacket数据缓冲区更改为一个大数组。现在,当我接收数据时,我会一次获得所有数据,但当我尝试发送更大的文件时,一旦超过数组大小,它就无法工作。

我的问题是。我有一个多线程套接字服务器。如何确定何时接收到所有数据?例如,我需要发送一个图像,我将图像编码到base64中,并构造一个命令"BASE64IMAGE",然后服务器读取字符串,直到它到达END_OF_DATA?有更好的方法吗?谢谢

C#套接字,接收大文件

我的问题是。我有一个多线程套接字服务器。如何确定何时接收到所有数据?

发送"消息"有三个标准选项(无论是图像还是其他什么——一整团可能很大的数据):

  • 每个连接一条消息:您可以通过另一端关闭连接来检测消息的结束
  • 某种"结束消息"标记:在读取数据时,您会检查一个特殊的标记,该标记指示消息的结束。如果标记可以自然发生,你需要逃离它——并在阅读时取消标记
  • 在发送实际数据之前指示消息大小的标头-只需读取那么多字节

就我个人而言,我喜欢最后一个选项——它使阅读数据并确保你已经掌握了比前两个选项简单得多的数据。您可以在开始之前分配适当的内存来接收数据,等等。但是,当您在开始之前不知道消息大小时,它就无法很好地处理。您可以通过为单个消息设置多个"块"来修改该方案,其中您先发送块大小,然后发送数据,块大小为0表示数据结束。

请注意,如果您只通过套接字传输数据,并且不需要它是7位干净的ASCII,则我不会首先转换为Base-64。只要将其作为二进制数据传输,您的代码在时间和带宽上都会更简单、更高效。

您可以首先发送要发送的字节数。接收方首先读取这个,然后知道将来会有那么多字节。

例如,您对文件进行编码,并确定编码的大小为800字节。您先发送数字800(例如,四个字节),然后发送文件。

接收方读取四个字节,得到数字800,然后知道再读取800个字节以接收整个文件。

这就是所谓的长度预填充。