黑马程序员技术交流社区
标题:
关于shutdownOutput 对流对象的关闭
[打印本页]
作者:
李挺
时间:
2013-2-24 15:25
标题:
关于shutdownOutput 对流对象的关闭
import java.io.*;
import java.net.*;
class TextClient
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("192.168.1.254",10006);
BufferedReader bufr =
new BufferedReader(new FileReader("IPDemo.java"));
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;
while((line=bufr.readLine())!=null)
{
out.println(line);
}
s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1.
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = bufIn.readLine();
System.out.println(str);
bufr.close();
s.close();
}
}
复制代码
里面 用到了
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