请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

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

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

正在回答

1回答

Stannum 2019-09-14 17:52:59

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

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 EverL #1
    收到,之前我都是写个一两次感觉并没有阻塞,所以对这个方法产生了疑问,没有考虑到缓存的问题。
    
    by the way,这才是课程里想要听到的原理层面的内容!
    回复 有任何疑惑可以回复我~ 2019-09-14 17:59:21
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信