请问OutputStream#write()是阻塞方法吗?

来源:4-3 实战:Socket

EverL

2019-09-11

比如InputStream#read()是阻塞式的,因此当服务器端调用read()就会阻塞,直到客户端发来数据。

同理,OutputStream#write()是只有服务端调用了read()准备接收数据,write()才能不阻塞吗?还是直接执行?

这儿关于write()的阻塞形式没有明白,希望老师指点一下,谢谢

写回答

1回答

Stannum

2019-09-14

同学你好~是的,OutputStream.write()方法也是阻塞式调用。

你可以自己写一个只会accept但是不read的服务器,然后在客户端使用一个无限循环不停调用write向服务器发送数据。你觉得运行时,在客户端会出现什么现象呢?

当系统试图把数据发送给服务器时,由于服务器端没有调用read(),所以数据只能被存放在服务器端的缓冲区,但是多大的缓冲区也总会有装满的时候,这时数据已经没有办法成功的被发送到服务器端,这时如果客户端仍然在调用write(),这些数据就只能暂时被保存在客户端的缓存内,直到客户端的缓存也满了,这时继续调用write(),你就会观察到write()开始阻塞了,因为这时两端的缓冲区都已经满了,数据发送必须等待服务器端开始读取数据,才能慢慢恢复

0
1
EverL
收到,之前我都是写个一两次感觉并没有阻塞,所以对这个方法产生了疑问,没有考虑到缓存的问题。 by the way,这才是课程里想要听到的原理层面的内容!
2019-09-14
共1条回复

系统学习Java网络编程 深度理解BIO/NIO/AIO

对比式学习助你真正理解BIO/NIO/AIO三大网络编程模型。

880 学习 · 148 问题

查看课程