read(缓冲区,偏移量,长度)如何实际工作,如果我将长度读取为32,这是否意味着它将保持阻塞直到它收到32个字节?
我知道它会返回和异常,或者在套接字异常或连接关闭时分别为0.
如果发送方只发送31个字节,会读取继续阻塞吗?如果这是真的,是否意味着read总是返回等于传递给它的长度的整数?以及如果在一定时间后没有剩下的1个字节,我如何控制超时.
重要但尚未回答
相反,如果发送方发送32字节,那么确保读取将阻塞直到所有32个接收到,或者它可以在不读取所有32个字节的情况下出现.
不,它不会阻止.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"