C#套接字,接收大文件

时间:2012-02-10 07:06:25

标签: c# sockets

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

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

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

2 个答案:

答案 0 :(得分:5)

  

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

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

  • 每个连接一条消息:您可以通过另一端关闭连接来检测消息的结尾
  • 某种“结束消息”标记:当您读取数据时,会检查指示消息结束的特殊标记。如果标记可以自然发生,您将需要将其转义 - 并在阅读时进行无意识
  • 一个标题,指示在发送实际数据之前消息的大小 - 只读取多个字节

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

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

答案 1 :(得分:0)

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

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

接收方读取4个字节,获取数字800,然后知道读取800个字节以接收整个文件。

这称为长度前缀。