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