黑马程序员技术交流社区

标题: 关于shutdownOutput 对流对象的关闭 [打印本页]

作者: 李挺    时间: 2013-2-24 15:25
标题: 关于shutdownOutput 对流对象的关闭
  1. import java.io.*;
  2. import java.net.*;

  3. class  TextClient
  4. {
  5.         public static void main(String[] args) throws Exception
  6.         {
  7.                 Socket s = new Socket("192.168.1.254",10006);

  8.                 BufferedReader bufr =
  9.                         new BufferedReader(new FileReader("IPDemo.java"));



  10.                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);


  11.                 String line = null;
  12.                 while((line=bufr.readLine())!=null)
  13.                 {
  14.                         out.println(line);
  15.                 }

  16.                 s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1.

  17.                
  18.                 BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

  19.                 String str = bufIn.readLine();
  20.                 System.out.println(str);

  21.                 bufr.close();

  22.                 s.close();
  23.         }
  24. }
复制代码
里面 用到了s.shutdownOutput();
API上说:禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。 如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将抛出 IOException。
那就是说这个动作已经把流关闭了
那后面还写s.close(); 是多余的么?

作者: 偏執旳、靑春    时间: 2013-2-24 15:53
1.shutdownOutput()的意思是关掉什么流?输出流是不?往外写
2.一个TCP有两个流,你只关了输出流,那么输入流怎么办?开启在那里,资源的浪费,安全的隐患
3.close()的作用关闭整个同道,那么资源也就随之释放了。
作者: 贾振凯    时间: 2013-2-24 16:18
本帖最后由 贾振凯 于 2013-2-24 16:19 编辑

你仔细看代码应该会注意到,shutdownOutput()以后还在readLine(),也就是说虽然关闭了输出流,但是输入流处于打开状态,依然占用着资源!

其实shutdownOutput(),shutdownIntput()可以说是Socket提供的两个半关闭方法,一般一站式的通信式协议用得更多一些。

更重要的一点是,就算同一Socket同时调用了shutdownOutput(),shutdownIntput()来关闭输入输出流,Socket实例依然没有被关闭,只是单纯的不能读写啦而已!

所以,一定不要忘了最后的close()!!!!!!!!!!!!!!
作者: 侯丛政    时间: 2013-2-24 23:52
楼主的s.shutdownOutput只是关闭了输出流而已, 并不会释放占用的系统资源
另外我有一点想请教楼主   代码第八行:
Socket s = new Socket("192.168.1.254",10006);
我标注的红字部分真的能这么用吗?

作者: SnailRen    时间: 2014-2-14 14:51
很想请问一下各位大神,有没有什么操作可以代替shutdownOutput();  就是和他一样的效果。用什么方法。
因为一旦你用了shutdownOutput();   之后,后面你还想发其他的数据出去就不行了。而且又不允许重新打开输出流。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2