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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何丛 中级黑马   /  2013-9-21 10:36  /  3786 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何丛 于 2013-9-24 12:29 编辑
  1. public class DemoClient {


  2.         public static void main(String[] args) {
  3.                 try {
  4.                         Socket  socket = new Socket("localhost" ,10006) ;               
  5.                         
  6.             //实例化流对象               
  7.                         BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
  8.                         BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) ;
  9.                         
  10.                         //向服务器端发送消息
  11.                         String string = "hello , this is Client\n " ;
  12.                         bufferedWriter.write(string) ;
  13.                         bufferedWriter.flush();
  14.                         socket.shutdownOutput();
  15.                         bufferedWriter.close();
  16.                         //接收消息
  17.                         System.out.println(bufferedReader.readLine());
  18.                         //关闭        
  19. //                        bufferedWriter.close();
  20.                         bufferedReader.close();
  21.                         socket.close();
  22.                 } catch (UnknownHostException e) {
  23.                         e.printStackTrace();
  24.                 } catch (IOException e) {
  25.                         e.printStackTrace();
  26.                 }

  27.         }

  28. }
复制代码
在使用完BufferedWriter后关闭它,会在System.out.println(bufferedReader.readLine());这一句报异常socket closed , 如果bufferedWriter.close();放在System.out.println(bufferedReader.readLine());之后则运行正常,请问Socket流关闭之后Socket也随之关闭了吗?那为什么socket.close();不报错呢?

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

4 个回复

倒序浏览
我是这么觉得的:
  BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) ;
这句话运行后,将BufferedWriter ,OutputStreamWriter,socket.getOutputStream,socket就联系起来了。
当你关掉中间的任何一个流,他们就都关了。然后你再用input流读取数据的时候就读不出来了。就像四个人拿绳子绑起来,一个掉水里,其它都掉水里。
那要关闭socket.getOutputStream获取的输出流就用socket的中的shutdown方法,让socket主动关闭,它还能操作流。它自己把绳子割断了,其它三个都掉水里了。
至于socket.close(),为什么不报错。我认为socket不仅仅只有输入输出流。bufferedWriter.close()只是切断了socket的流的联系。你再关掉socket也不会报错。
你看老师视屏里面。用shutdown方法传递结束标记,终止一个流。最后都是只需用socket.close(),关闭了socket,与其相关的流就都关了。只有当你读取或写入硬盘文件,与socket流无关的时候,才需要你另外单独关闭。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
胡智 发表于 2013-9-21 18:40
我是这么觉得的:
  BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket. ...

谢谢你的解答,但是我不太同意你的看法。
API上的原话
“关闭返回的 InputStream 将关闭关联套接字”   
“套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接或重新绑定)。需要创建新的套接字。
关闭此套接字也将会关闭该套接字的 InputStreamOutputStream。”
Socket关闭方法

public synchronized void close() throws IOException {
        synchronized(closeLock) {
            if (isClosed())
                return;
            if (created)
                impl.close();
            closed = true;
        }
    }
这大概是Socket关闭后调用close方法不保错的原因吧



回复 使用道具 举报
如果问题已经解决,请重新编辑帖子,修改帖子的主题分类为“已解决”{:soso_e181:}
回复 使用道具 举报
学习到了.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马