当前位置:  开发笔记 > 编程语言 > 正文

C#Networkstream.read()

如何解决《C#Networkstream.read()》经验,为你挑选了1个好方法。

read(缓冲区,偏移量,长度)如何实际工作,如果我将长度读取为32,这是否意味着它将保持阻塞直到它收到32个字节?

我知道它会返回和异常,或者在套接字异常或连接关闭时分别为0.

如果发送方只发送31个字节,会读取继续阻塞吗?如果这是真的,是否意味着read总是返回等于传递给它的长度的整数?以及如果在一定时间后没有剩下的1个字节,我如何控制超时.

重要但尚未回答

相反,如果发送方发送32字节,那么确保读取将阻塞直到所有32个接收到,或者它可以在不读取所有32个字节的情况下出现.



1> Alfred Myers..:

不,它不会阻止.Read操作读取尽可能多的数据,最多可达size参数指定的字节数.来源:http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.read.aspx

鉴于它不会等待额外的1个字节,如果你期望它,你应该实现一个循环来继续读取流.你可以退出循环然而你感觉最好.


更新:我错了,当我说"没有阻塞在所有如果没有数据可供读取,读取方法返回0.",但我是正确的,当我说,它不会阻碍等待填满整个缓冲区,其它是Kazoom问题中描述的场景.

更新以演示NetworkStream.Read阻塞等待第一个字节,但不阻止等待填充整个缓冲区.

创建控制台项目

一方面,你有听众:

IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345);
TcpListener listener = new TcpListener(ep);
listener.Start();
TcpClient client = listener.AcceptTcpClient();
NetworkStream s = client.GetStream();
byte[] buffer = new byte[32];
Console.WriteLine(s.Read(buffer, 0, 32));
Console.WriteLine("Press any key to continue...");
Console.Read();

另一方面,我们只发送一个字节:

IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345);
TcpClient client = new TcpClient();
client.Connect(ep);
client.GetStream().Write(new byte[] { 60 }, 0, 1);
Console.WriteLine("Press any key to continue...");
Console.Read();

双方都会一直运行,直到他们到达Console.Read().请注意,侦听器不会阻止Read.

听众将打印"1"

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有