如何接收不定长的二进制流

吃草的猪 2011-06-08 02:46:57
我写了一个程序,通过Socket读取发送到指定端口的二进制流,如下:

byte[] recvBytes = new byte[1024];
int bytes;

//从服务器端接受返回信息
bytes = soc_Connect.Receive(recvBytes, recvBytes.Length, 0);
System.IO.MemoryStream _memory = new System.IO.MemoryStream(recvBytes);

但现在业务中这个二进制流的大小是不定的。可能是几K,也有可能是几M,我之前写过的方法里面都是先指定 byte[] 的长度,有没有不需要事先指定长度,而是根据实际数据大小再来指定长度的方法。
...全文
144 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
吃草的猪 2011-06-09
  • 打赏
  • 举报
回复
UP一下
吃草的猪 2011-06-08
  • 打赏
  • 举报
回复
楼上的能不能给个小例子看看
lijunfeng 2011-06-08
  • 打赏
  • 举报
回复
如果内容上限不大的话方便的方法就是在数据头部加上一个表示长度的信息,先读取长度信息再根据长度信息取数据。
如果内容可能很大的话就先按照一个固定的长度接收数据到缓冲区内,待数据接收完了之后再处理缓冲区内的数据,或者每接收一段数据后就判断一下缓冲区内的数据是否可以处理,能够处理的话就进行处理,不能处理的话就继续待下一次接收到数据再检测。
兔子-顾问 2011-06-08
  • 打赏
  • 举报
回复
先缓存数据,在判定完整性,再处理。
vrhero 2011-06-08
  • 打赏
  • 举报
回复
循环Receive,直到返回值(即读取值)为0...缓冲区就是这么用的,这是基础知识...
吃草的猪 2011-06-08
  • 打赏
  • 举报
回复
List<ArraySegment<byte>> list = new List<ArraySegment<byte>>();
bytes = soc_Connect.Receive(list);

我用了范形接收以后,下面的语句通不过,该怎么把 List<ArraySegment<byte>>类型转换为 byte[]类型呢
byte[] recvBytes = ((ArraySegment<byte>)list.ToArray()).Array;
flyerwing 2011-06-08
  • 打赏
  • 举报
回复
==10K就收10K
否则有多少搞多少
isjoe 2011-06-08
  • 打赏
  • 举报
回复
从数据下手,你需要为接收的数据指定附加信息。例如长度等等。
kingdom_0 2011-06-08
  • 打赏
  • 举报
回复
     别用数组,用List<byte>多好,数据处理好了,再转为byte[]
List<byte> list = new List<byte>();
list.ToArray();
bdmh 2011-06-08
  • 打赏
  • 举报
回复
Receive 不是有好几个重载吗,你用泛型那个
龍月 2011-06-08
  • 打赏
  • 举报
回复
指定了大小的话, 大于的 就平均 分配 ,算法要写好

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧