请问OutputStream#write()是阻塞方法吗?
来源:4-3 实战:Socket

EverL
2019-09-11
比如InputStream#read()是阻塞式的,因此当服务器端调用read()就会阻塞,直到客户端发来数据。
同理,OutputStream#write()是只有服务端调用了read()准备接收数据,write()才能不阻塞吗?还是直接执行?
这儿关于write()的阻塞形式没有明白,希望老师指点一下,谢谢
写回答
1回答
-
同学你好~是的,OutputStream.write()方法也是阻塞式调用。
你可以自己写一个只会accept但是不read的服务器,然后在客户端使用一个无限循环不停调用write向服务器发送数据。你觉得运行时,在客户端会出现什么现象呢?
当系统试图把数据发送给服务器时,由于服务器端没有调用read(),所以数据只能被存放在服务器端的缓冲区,但是多大的缓冲区也总会有装满的时候,这时数据已经没有办法成功的被发送到服务器端,这时如果客户端仍然在调用write(),这些数据就只能暂时被保存在客户端的缓存内,直到客户端的缓存也满了,这时继续调用write(),你就会观察到write()开始阻塞了,因为这时两端的缓冲区都已经满了,数据发送必须等待服务器端开始读取数据,才能慢慢恢复
012019-09-14
相似问题