采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
比如InputStream#read()是阻塞式的,因此当服务器端调用read()就会阻塞,直到客户端发来数据。
同理,OutputStream#write()是只有服务端调用了read()准备接收数据,write()才能不阻塞吗?还是直接执行?
这儿关于write()的阻塞形式没有明白,希望老师指点一下,谢谢
同学你好~是的,OutputStream.write()方法也是阻塞式调用。
你可以自己写一个只会accept但是不read的服务器,然后在客户端使用一个无限循环不停调用write向服务器发送数据。你觉得运行时,在客户端会出现什么现象呢?
当系统试图把数据发送给服务器时,由于服务器端没有调用read(),所以数据只能被存放在服务器端的缓冲区,但是多大的缓冲区也总会有装满的时候,这时数据已经没有办法成功的被发送到服务器端,这时如果客户端仍然在调用write(),这些数据就只能暂时被保存在客户端的缓存内,直到客户端的缓存也满了,这时继续调用write(),你就会观察到write()开始阻塞了,因为这时两端的缓冲区都已经满了,数据发送必须等待服务器端开始读取数据,才能慢慢恢复
收到,之前我都是写个一两次感觉并没有阻塞,所以对这个方法产生了疑问,没有考虑到缓存的问题。 by the way,这才是课程里想要听到的原理层面的内容!
登录后可查看更多问答,登录/注册
对比式学习助你真正理解BIO/NIO/AIO三大网络编程模型。
1.4k 1
883 5
885 5
843 5
880 5