java关闭IO流的时候Socket也同时关闭

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java关闭IO流的时候Socket也同时关闭相关的知识,希望对你有一定的参考价值。

为什么我关闭IO流的时候,Socket也跟着关闭了。客户端还需要返回信息,怎样才能解决这个问题?或者说应该用什么思路?

参考技术A 楼主解决了么,我想到一个办法:
服务端:就是每次接收到一个客户端请求以后,都重新启动一个线程用于逻辑处理,处理完毕后关闭该线程会自动关闭。
客户端:每次发送/接收数据都新建一个socket ,发送完/传输完就关闭当前socket
参考技术B 你的服务端也建立输出流,可以把信息发给客户端,客户端建立输入流,接受服务端发来的信息,这个可以设为死循环接受,就是while(true) 监听服务端发送回来的信息。追问

必须在这里写writerc.close();   否者服务端收不到信息,但是一旦关闭了,socket也跟着关闭了。

追答

clientSocket = new Socket("localhost",12580);
String nickName = null;
//创建输出流
PrintWriter pw = new PrintWriter(
new OutputStreamWriter(clientSocket.getOutputStream(),
"UTF-8"),true);
/*
* 建立输出流,给服务端发信息
*/
Scanner scanner = new Scanner(System.in);
OutputStream os = clientSocket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
PrintWriter pw = new PrintWriter(osw,true);

while(true)

pw.println(scanner.nextLine());

供你参考,简单的写了一下

本回答被提问者采纳
参考技术C 你错的不是关闭writer,是你的writer没有flush,之所以关闭writer客户端会受到消息,是因为执行writer.close()时,缓冲区里的数据都会发送给客户端,真正做到发送数据不是靠writer.close,靠的是writer.flush。要实时和服务器,就不要关闭io流,网上的参考代码大多数都是单次通讯,所以才会在处理完数据后close

关于java中io流的关闭问题,部分代码,这种情况用不用关闭new FileReader(file)?

BufferedReader br = null;
br=new BufferedReader(new FileReader(file));
br.close();

参考技术A 是的,你的new FileReader(file)是一个匿名对象。

JVM中对于那些打开了没有关闭的IO文件流,会在不再被使用的情况下,等到下次做Full GC的时候把他们全部回收,尽量少使用这种写法。文章来自:http://blog.csdn.net/kongxx/article/details/6405914
参考技术B public BufferedReader(Reader in) 
    this(in, defaultCharBufferSize);

public BufferedReader(Reader in, int sz) 
    ...
    this.in = in;//FileReader
    ...

看BufferedReader的close方法:

public void close() throws IOException 
    ...
    in.close();//调用FileReader的close方法
    ...

调用BufferedReader的close()方法就可以调用FileReader的close()方法,所以楼上的回答不正确.

以上是关于java关闭IO流的时候Socket也同时关闭的主要内容,如果未能解决你的问题,请参考以下文章

Java socket中关闭IO流后,发生啥事

java 文件切割,为什么在关闭流的时候报错,51行

关于java中io流的关闭问题,部分代码,这种情况用不用关闭new FileReader(file)?

java IO包装流如何关闭

Java中的IO字节流

java里tcp中socket的io流到底要不要关闭,请说下原因。