老师,OutputStream#write() 是阻塞方法吗?我自己测试的结果是不阻塞,请指点一下。

来源:7-1 阻塞IO和⾮非阻塞IO

EverL

2019-09-05

Client.java

http://img1.sycdn.imooc.com/szimg/5d7077ad092d8fc009650150.jpg



Server.java

http://img.mukewang.com/szimg/5d70780f096697e910350320.jpg

写回答

1回答

Qiujuer

2019-09-06

你这里的代码有一定的错误。

客户端部分,对于println方法是一个输出方法,此时的writer是socket链接的流,所以进行该方法调用时会直接将文字发送给Socket的流进行处理,这个地方基本不阻塞,但是并不代表他不是阻塞方法,他会等待将数据发送给缓冲区后就继续往下走。


对于服务器部分,你的Syste.in.read() 方法无需调用的哈,因为该方法的调用会进入控制台的流等待状态,而不能得到客户端发送过来的数据,可以将改行去掉。

0
2
Qiujuer
回复
EverL
flush并不代表数据发送到网上了,可能数据在客户端的网络缓冲层,也可能在服务器的网络缓冲层;这个部分是不会阻塞的,除非把缓冲区占满了后才会开始阻塞。 部分机器的网络层甚至还是共享的,也就是A进程发送的数据把缓冲区占满后,B进程也将无法正常进行网络输出。 这个体现在某个进程可能发送大量垃圾数据占满,然后导致浏览器无法访问界面等情况。
2019-09-08
共2条回复

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2314 学习 · 476 问题

查看课程