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

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐