请稍等 ...
×

采纳答案成功!

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

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

正在回答 回答被采纳积分+3

1回答

Qiujuer 2019-09-06 09:22:38

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

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


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

0 回复 有任何疑惑可以回复我~
  • 提问者 EverL #1
    第一,客户端调用了flush,是不是数据就已经通过socket发送到网络上了?
    第二,服务器之所以system.in.read,我是想服务器端暂时不能read,正好可以观察客户端的write是不是阻塞的
    回复 有任何疑惑可以回复我~ 2019-09-06 12:13:11
  • Qiujuer 回复 提问者 EverL #2
    flush并不代表数据发送到网上了,可能数据在客户端的网络缓冲层,也可能在服务器的网络缓冲层;这个部分是不会阻塞的,除非把缓冲区占满了后才会开始阻塞。
    
    部分机器的网络层甚至还是共享的,也就是A进程发送的数据把缓冲区占满后,B进程也将无法正常进行网络输出。
    
    这个体现在某个进程可能发送大量垃圾数据占满,然后导致浏览器无法访问界面等情况。
    回复 有任何疑惑可以回复我~ 2019-09-08 21:57:32
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信