为了账号安全,请及时绑定邮箱和手机立即绑定

为什么第二次服务端不用shutOutputStream,客户端不用shutInputStream?

服务器接收客户端信息的时候,老师读取完,就shutInputStream(),但是第二次服务器向客户端发送信息时却不用shutOutputStream(),客户端也是,我自己加下去试了下,却报错为什么?求大神解答下,感激不尽

正在回答

4 回答

这么说吧,客户端发送信息给服务端,服务端接受,客户端,服务器端老师完全可以不关闭输入输出流,直接关闭socke和相关资源,信息依然可以正常传r送。这是因为关闭了客户端和服务器端socket,程序在终结socket之前,会将相应的信息发送完成,信息处理完成,然后关闭。如果,你加上服务器给客户端发送信息,然后客户端接收,你就必须知道。客户端之前是由一个输出流在发送数据,如果它不关闭,就意味着数据仍然没有发送完,这时候,服务器端接收到的输入流就没有结束信号,程序就会一直卡在那里。只有关闭了,才能给服务器端一个信号,告诉他我把信息发完了。至于老师为什么第二次服务器发送客户端信息的时候没加shutdown,实际上是可以加上的,没任何问题,我不知道你的为啥出问题了,当然最后不加也是可以的,因为最终他的关闭socket也会让客户端接收到终止信号。

这是关闭输出流的源码,其实他就干了两件事;shutout=true,getImpl().shutdownput();

http://img1.sycdn.imooc.com//573e7e1d0001144e04510220.jpg

0 回复 有任何疑惑可以回复我~

我说一下个人理解,如果有错还望指出

close关闭的是整个socket,shutdown关闭的输入或者输出流

当需要切换的时候,我可以shutdown掉一个流,这时候整个socket并不会关闭

所以,最后只要close了,关不关闭并不影响;因为需要切换输入输出,所以才shutdown了

像一开始没有服务器端再回复客户端的时候,我们不去shutdown直接close也是可以的

0 回复 有任何疑惑可以回复我~
#1

lucitas 提问者

额,那为什么我在第二次在close钱加入shutdown,关闭了最后一个流,但是程序会出现异常,直接close才正确运行,照你的说法来,结果应该是二者等价,close前 shutdown并不会对结果有影响才对啊. 我自己测验,当socket中只有一个流,你close前,加不加shutdown 都可以,如果两个流你都shutdown了,再close好像会报错。会不会是,shutdown的功能其实主要只是用来在开启另一个流前关闭前一个流呢。
2016-04-09 回复 有任何疑惑可以回复我~

同问!

0 回复 有任何疑惑可以回复我~

同问!

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

为什么第二次服务端不用shutOutputStream,客户端不用shutInputStream?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信