java socket和流的关系
2014-04-18 21:09
239 查看
今天做socket相关的输入输出.当使用完一个输入或者输出流以后,我想关闭它,但是直接调用
inputstream.close的时候,再次使用会发现抛出异常,告诉你socket closed
查了一下,发现直接关闭流,会导致socket也被关闭.
正确的调用方法是不直接关闭流,而是调用socket的closeinput/closeoutput方法来关闭,这样可以避免socket被关闭的问题
以下转载
只要关闭Socket的InputStream或OutputStream其中任何一个,就关闭了Socket,这是不好的关闭方法。正确的方法应该是ShutdownInput/ShutdownOutput。
通常应用程序也可以在OutputStream写一个专门的结束标记替代EOF,然后flush。但在一些专门的编码的Stream里flush和close是有不同语意的,比如chunked编码、比如ZIP压缩等。在这种情况下调用了OutputStream的close就不能再接收任何信息。
比如使用ZIP压缩发送和接收数据的例子:
发送方:在Socket的OutputStream上封装GZIPOutputStream或DeflaterOutputStream
1、发送数据
2、发送数据结束标志(此时需要关闭GZIPOutputStream或DeflaterOutputStream,否则不保证全部数据都被发送至对方)
3、接收应答
4、结束
接收方:在Socket的InputStream上封装GZIPInputStream或InflaterInputStream
1、接收数据
2、收到数据结束标志
3、发送数据处理结果
4、结束。
按道理,发送方在发送完结束标志后应该可以关闭Output了,如果简单的调用了OutputStream.close,JDK的实现就会把InputStream和Socket同时关闭,这显然是不行的。为了正确的实现应用逻辑,就需要做一些额外的、本来不必要的处理。比如需要覆盖SocketOutputStream的close,让它调用Socket.ShutdownOutput,而不调用它的close.
inputstream.close的时候,再次使用会发现抛出异常,告诉你socket closed
查了一下,发现直接关闭流,会导致socket也被关闭.
正确的调用方法是不直接关闭流,而是调用socket的closeinput/closeoutput方法来关闭,这样可以避免socket被关闭的问题
以下转载
只要关闭Socket的InputStream或OutputStream其中任何一个,就关闭了Socket,这是不好的关闭方法。正确的方法应该是ShutdownInput/ShutdownOutput。
通常应用程序也可以在OutputStream写一个专门的结束标记替代EOF,然后flush。但在一些专门的编码的Stream里flush和close是有不同语意的,比如chunked编码、比如ZIP压缩等。在这种情况下调用了OutputStream的close就不能再接收任何信息。
比如使用ZIP压缩发送和接收数据的例子:
发送方:在Socket的OutputStream上封装GZIPOutputStream或DeflaterOutputStream
1、发送数据
2、发送数据结束标志(此时需要关闭GZIPOutputStream或DeflaterOutputStream,否则不保证全部数据都被发送至对方)
3、接收应答
4、结束
接收方:在Socket的InputStream上封装GZIPInputStream或InflaterInputStream
1、接收数据
2、收到数据结束标志
3、发送数据处理结果
4、结束。
按道理,发送方在发送完结束标志后应该可以关闭Output了,如果简单的调用了OutputStream.close,JDK的实现就会把InputStream和Socket同时关闭,这显然是不行的。为了正确的实现应用逻辑,就需要做一些额外的、本来不必要的处理。比如需要覆盖SocketOutputStream的close,让它调用Socket.ShutdownOutput,而不调用它的close.
相关文章推荐
- java Socket 缓冲区与请求的关系
- Java Socket编程如何建立两者关系
- Java Socket与操作系统的关系
- 如何删除子域信任关系?
- SQL server2005服务器登录名、角色、数据库用户、角色、架构的关系
- UML类图关系表示方法
- UML类图几种关系的总结
- Hibernate学习之表一对多,多对一关系
- xml 文件 和xsd 文件的关系
- struts、hibernate、spring这三个框架和J2EE是什么关系?
- 图挖掘:社会网络分析和多关系数据挖掘
- MFC,C++,VC++,VS2010 之间究竟是什么关系
- 信号发生器的输出阻抗与负载的关系
- 杂七杂八——Name与x:Name的关系
- 控制台下关于进程和本地端口的关系
- webservices和wcf的关系
- Sorting It All Out 拓扑排序&&判断是否存在环,是否关系包含所有的点
- 开发:随笔记录之 新老父子级关系替换
- JDK、JRE和JVM三者之间的关系
- 抽象类与接口之间的关系