C#套接字,接收大文件

use*_*551 0 c# sockets

我现在正在使用asyn套接字.我有一个回调函数'onDataReceived',只要我收到任何数据就会触发它.

首先我一次得到一个char,所以我将socketPacket数据缓冲区更改为一个大数组.现在,当我不断接收数据,我得到这一切在一次,但是当我试图发送一个更大的文件,一旦它超过了数组的大小这是行不通的.

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

Jon*_*eet 6

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

发送"消息"有三种标准选项(无论是图像还是其他内容 - 可能很大的整个数据块):

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

就个人而言,我喜欢最后一个选项 - 它使得阅读数据并确保你比前两个选项简单得多.您可以在开始之前分配适当数量的内存来接收数据等.但是,如果在开始之前不知道消息大小,则无法很好地应对.您可以通过为单个消息提供多个"块"来修改方案,其中您发送块大小然后发送数据,块大小0表示数据的结束.

需要注意的是,如果你在只是一个套接字传输数据,而你并不需要它是7位ASCII干净,我就不会转换为基64首.只需将其作为二进制数据传输 - 您的代码将在时间和带宽上更简单,更高效.