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

来源:3-4 完善用户登陆之服务器响应客户端

lucitas

2016-04-03 16:09

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

写回答 关注

4回答

  • qq_云在风中_0
    2016-05-20 11:02:39

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

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

    http://img.mukewang.com/573e7e1d0001144e04510220.jpg

  • 1041156951
    2016-04-09 16:14:13

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

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

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

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

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

    lucita...

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

    2016-04-09 21:07:28

    共 1 条回复 >

  • qq_性感小黄瓜_03119509
    2016-04-09 11:29:57

    同问!

  • 拉面啊
    2016-04-04 13:08:09

    同问!

Java Socket应用---通信是这样练成的

分享的是 Java 中的网络编程,使用Socket实现网络聊天通信

125013 学习 · 590 问题

查看课程

相似问题