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

在C#中实现网络聊天程序时遇到netstream.Read()函数持续读取全0的问题。原因是未正确处理消息边界,导致Read()在没有完整消息时持续读取。解决方案是理解Stream的读取机制,使用BeginRead进行异步读取,并定义明确的消息结束标记。同时,不应在一次Read后立即解码,而应累积数据直到完整消息到达。要注重协议设计,确保消息结构化,避免依赖不规范的博客教程。
摘要由CSDN通过智能技术生成

刚接触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()函数的问题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值