怎么用BinaryReader的ReadString()方法把客户端数据读完?

usun82 2014-06-27 03:00:31
怎么判断ReadString()把数据读完了呢?判断出没有读完时,怎么继续读?
...全文
409 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
usun82 2014-08-27
  • 打赏
  • 举报
回复
已经解决了,这个问题是由于socket的收发方式不一致产生的。
tcmakebest 2014-06-28
  • 打赏
  • 举报
回复
楼主这是读取网络数据啊,那很不幸,如果网络没有断,那就是读不完 的.
  • 打赏
  • 举报
回复
如果通讯的消息是文本的,并且以换行(或者回车、或者换行回车的组合)分隔,那么你可以直接使用StreamReader的ReadLine语句读取一整行。这就无需循环Read然后判断是否找到分隔符了,因为ReadLine替你做了这个事情。
  • 打赏
  • 举报
回复
流式通讯本来就是这样的,发送端要等到足够多的数据之后才打成一个数据包发送出去。因此你Read得到的数据等于或者少于发送端的数据,这是很正常的。此时你需要进行多次Read直到收到“完全”的数据。
引用 5 楼 usun82 的回复:
大概知道是什么原因了,发送的客户端不是我写的,那能不能在不知道对方发送长度的情况下,把数据读完。比如对方每次发送加上一个分隔符,我怎么根据分隔符来判断读完了,用哪个方法?
判断你ReadString 得到的最后一个字符是不是分隔符呗。这个问题提得有点“傻”哦,你自己就说出“对方每次发送加上一个分隔符”了,还不知道如何判断读取到了分隔符?
usun82 2014-06-28
  • 打赏
  • 举报
回复
那我出现上面读取不全的原因,有没有可能是客户端发送不全呢,或者一定是服务端没读取完全。
usun82 2014-06-27
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
[quote=引用 5 楼 usun82 的回复:] 大概知道是什么原因了,发送的客户端不是我写的,那能不能在不知道对方发送长度的情况下,把数据读完。比如对方每次发送加上一个分隔符,我怎么根据分隔符来判断读完了,用哪个方法?
什么是通信协议?其实就是一种约定. 我给你发个1,代表OK.发个2,代表不OK. 要通信就必须两边使用相同的协议,否则我给你发个1,你认为不OK,那不完了? 跟做客户端的人好好沟通一下,他到底怎么发的,或者你到底想让他怎么发.[/quote] 纯属废话,你看清我问的问题了吗
於黾 2014-06-27
  • 打赏
  • 举报
回复
引用 5 楼 usun82 的回复:
大概知道是什么原因了,发送的客户端不是我写的,那能不能在不知道对方发送长度的情况下,把数据读完。比如对方每次发送加上一个分隔符,我怎么根据分隔符来判断读完了,用哪个方法?
什么是通信协议?其实就是一种约定. 我给你发个1,代表OK.发个2,代表不OK. 要通信就必须两边使用相同的协议,否则我给你发个1,你认为不OK,那不完了? 跟做客户端的人好好沟通一下,他到底怎么发的,或者你到底想让他怎么发.
usun82 2014-06-27
  • 打赏
  • 举报
回复
大概知道是什么原因了,发送的客户端不是我写的,那能不能在不知道对方发送长度的情况下,把数据读完。比如对方每次发送加上一个分隔符,我怎么根据分隔符来判断读完了,用哪个方法?
gomoku 2014-06-27
  • 打赏
  • 举报
回复
你发送的时候用了BinaryWriter.WriterString了吗?BinaryWriter.WriteString会先写一个字符串的长度信息
usun82 2014-06-27
  • 打赏
  • 举报
回复
那为什么我使用这个方法读取的时候,它没有读完就返回值了呢,比如:第一次给它发送“123456789”,它读取到的是“12345”,第二次再给它发送“123456789”,它读取到的是“6789123456789”,它把上次没读完的也读到了。
gomoku 2014-06-27
  • 打赏
  • 举报
回复
BinaryReader.ReadString返回就读完了。 因为ReadString会先读取一个长度前缀,作为读取字符串的长度。

110,538

社区成员

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

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

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