c#语言read函数,关于C#net stream.Read()函数的问题

刚接触C#网络通信,想写一个聊天程序,但是在呢天stream.Read()函数上遇到了点麻烦,请大虾指点一二。

我写的代码如下:

private NetworkStream nws = null;

//接收消息线程

private void ReceiveMsg()

{

while (true)

{

byte[] packet = new byte[_maxPacket];

nws.Read(packet, 0, packet.Length);

string receivestring = DecodingBytes(packet);

{

解码packet,显示消息函数

}

}

}

//发送端代码

receiverSkt.Send(Encoding.Unicode.GetBytes(receivestring));

然后问题就出现了,当顺利收到第一条消息后,按道理应该没有网络流,nws.Read(packet,0,packet.Length)应该处于等待状态,但是我调试的时候发现它一直在执行,且packet中接收到的都是全0(应该是空流)。这是什么情况???

—- 10分

1、你while (true),循环一直进行

2、

public override int Read(

byte[] buffer,

int offset,

int size

)

该方法将数据读入 buffer 参数并返回成功读取的字节数。

如果没有可读取的数据,则 Read 方法返回 0。

Read 操作将读取尽可能多的可用数据,直到达到 size 参数指定的字节数为止。 如果远程主机关闭了连接并且已接收到所有可用数据,Read 方法将立即完成并返回零字节。

—- 10分

不要把 filestream 的写法套用在 netstream上,你应该学到“它们是不同的”。先解决自己的这个“胡乱套用别的stream”的问题。

—-

对于你的代码

while (true)

,我从来没有这样写过,我都是写 BeginRead。我只是告诉你:

不要在一次 Read 之后就 Decoding,你怎么知道一次执行 Read 就获得了完整的消息?你应该连续 Read,直到读取到(信令格式设计文档上说明了的)消息结束边界时,你才能去解码。

另外,程序中最好不要有while循环。

—- 20分

就算是聊天信息仅仅是一句一句的文本,你也要了解你所传送的的消息中哪里是消息的结束标记。

真正的通讯协议是要正规指定一个结构化的“信令格式”的,不是随便一句句文本。不要上一些垃圾博客和简单视频的当。编写聊天程序,必须学会先定义信令格式,然后才写处理程序。

在下面这个帖子中我简单写了一个数据读取和解析处理的例子。虽然这是一个“串口数据”处理的,但是基本逻辑其实差不多。你在 BeginRead 所注册的回调方法中,也需要类似的方式,把你读取到的数据先存起来,然后等取得至少一个完整的消息了,才能开始处理(例如 Decoding)。

—-

—-

多谢,很到位,我确实应该再看看基础内容

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于C#net stream.Read()函数的问题!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值