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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李挺 中级黑马   /  2013-2-24 15:25  /  3978 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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(); 是多余的么?

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
1.shutdownOutput()的意思是关掉什么流?输出流是不?往外写
2.一个TCP有两个流,你只关了输出流,那么输入流怎么办?开启在那里,资源的浪费,安全的隐患
3.close()的作用关闭整个同道,那么资源也就随之释放了。
回复 使用道具 举报
本帖最后由 贾振凯 于 2013-2-24 16:19 编辑

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

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

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

所以,一定不要忘了最后的close()!!!!!!!!!!!!!!
回复 使用道具 举报
楼主的s.shutdownOutput只是关闭了输出流而已, 并不会释放占用的系统资源
另外我有一点想请教楼主   代码第八行:
Socket s = new Socket("192.168.1.254",10006);
我标注的红字部分真的能这么用吗?
回复 使用道具 举报
很想请问一下各位大神,有没有什么操作可以代替shutdownOutput();  就是和他一样的效果。用什么方法。
因为一旦你用了shutdownOutput();   之后,后面你还想发其他的数据出去就不行了。而且又不允许重新打开输出流。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马