A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈莹 中级黑马   /  2012-11-23 07:32  /  1657 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈莹 于 2012-11-23 22:29 编辑

socket在什么情况下会被关闭?(除了调用close方法关闭外)
我在关闭了由socket产生的流时,socket会被关闭吗?
例如:PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
pw.close();
请问这种情况下socket会被关闭吗?



我看看了API上这样写道:
getInputStreampublic InputStream getInputStream()                           throws IOException返回此套接字的输入流。 如果此套接字具有关联的通道,则所得的输入流会将其所有操作委托给通道。如果通道为非阻塞模式,则输入流的 read 操作将抛出 IllegalBlockingModeException
在非正常条件下,底层连接可能被远程主机或网络软件中断(例如,TCP 连接情况下的连接重置)。当网络软件检测到中断的连接时,将对返回的输入流应用以下操作:
  • 网络软件可能丢弃经过套接字缓冲的字节。网络软件没有丢弃的字节可以使用 read 读取。
  • 如果没有任何字节在套接字上缓冲,或者 read 已经消耗了所有缓冲的字节,则对 read 的所有后续调用都将抛出 IOException
  • 如果没有任何字节在套接字上缓冲,并且没有使用 close 关闭套接字,则 available 将返回 0。

关闭返回的 InputStream 将关闭关联套接字。

返回:从此套接字读取字节的输入流。 抛出: IOException - 如果在创建输入流时发生 I/O 错误、没有关闭套接字、没有连接套接字或者使用 shutdownInput() 关闭了套接字输入
getOutputStreampublic OutputStream getOutputStream()                             throws IOException返回此套接字的输出流。 如果此套接字具有关联的通道,则得到的输出流会将其所有操作委托给通道。如果通道为非阻塞模式,则输出流的 write 操作将抛出 IllegalBlockingModeException
关闭返回的 OutputStream 将关闭关联套接字。

返回:将字节写入此套接字的输出流。 抛出: IOException - 如果创建输出流时发生 I/O 错误或者没有连接套接字。
红色字体部分说明加入关闭流了也就会关闭socket共同学习吧!

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
关闭socket分为主动关闭和被动关闭,前者是指有本地主机主动发起的关闭;而后者则是指本地主机检测到远程主机发起关闭之后,作出回应,从而关闭整个连接。

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1 赞一个!

查看全部评分

回复 使用道具 举报
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
pw.close();
请问这种情况下socket会被关闭吗?
不会的。两种情况可以关闭  一个是客户端的关闭了 另一种就是服务端强制关闭客户端的连接

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1 赞一个!

查看全部评分

回复 使用道具 举报
jerry2627 发表于 2012-11-23 09:53
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
pw.close();
请问 ...

谢谢,API中socket的getInputStream和getOutputstream方法,上面说假如流关了,那么socket也会被关闭的
回复 使用道具 举报
jerry2627 发表于 2012-11-23 09:53
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
pw.close();
请问 ...

谢谢,API中socket的getInputStream和getOutputstream方法,上面说假如流关了,那么socket也会被关闭的
回复 使用道具 举报
陈莹 发表于 2012-11-23 22:32
谢谢,API中socket的getInputStream和getOutputstream方法,上面说假如流关了,那么socket也会被关闭的 ...

我也是这样理解的,难道楼主所标示的红色字体部分不是说明pw.close()能关闭Socket流吗?还是只能关闭它自身
回复 使用道具 举报
陈莹 中级黑马 2012-11-23 23:07:58
7#
李志阳 发表于 2012-11-23 22:59
我也是这样理解的,难道楼主所标示的红色字体部分不是说明pw.close()能关闭Socket流吗?还是只能关闭它 ...

我的意思是就是说如果流关了,那么socket就关了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马