这是client端:package com.liqiang_2;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;public class Client_One {
public static void main(String[] args) throws Exception {
Socket s = new Socket("localhost", 8089);
InputStream in = s.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String temp;
while ((temp=reader.readLine()) != null) {
System.out.println(temp);
}

// 关闭资源
reader.close();
//pw.close();
in.close();
//out.close();
s.close();
}
}这是服务端:service
package com.liqiang_2;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class Service {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(8089); while (true) {
Socket incomming = ss.accept();
InputStream in = incomming.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
OutputStream out = incomming.getOutputStream();
PrintWriter pw = new PrintWriter(out, true);
pw.write("service acceped!这是服务端发给客户端的");
// 关闭资源
//reader.close();
pw.close();
//in.close();
out.close();
incomming.close();
}
}
}这样运行是没有问题的,但是我不注释service中的reader.close()和in.close().就会出错,我知道我service中的input没有用,但是我不清楚为什么我连接了inputStream为什么就不可以关掉了?

解决方案 »

  1.   

    先给你解释下为什么reader关闭会报错,那是因为reader关闭后socket的inputStream就关闭了,并且socket也会被关闭,所以你报错了。因为socket是阻塞的,inputStream和outputStream是不能同时使用的。这就是socket的机制。
      

  2.   

    我原来要是没有输入流,service也会关闭啊。我是这么想的:
    我service服务打开,然后client连接上了,service发了一天语句后,service所持有的当前socket就关闭了,然后client就打印了啊和输入流应该是没有关系的
      

  3.   

    // 关闭资源
    //reader.close();
    pw.close();
    //in.close();
    out.close();
    incomming.close();我说过了:reader(也包括in)关闭后socket的inputStream就关闭了,并且socket也会被关闭
    如果你上述注释的代码没有注释掉的话,in.close()已经就把socket给关掉了,你再调用out.close()怎么可能不报错!(此时socket已经被关闭)
      

  4.   

    我调试过来,我service端先把socket关掉,client一样可以接受到刚开始service发出的信息。我服务端的socket是关闭了,但是我那条语句已经发出去了,client可以接收到的。
      

  5.   


    我的不是没有注释的话,不会报错,就是client 信息收不到了
      

  6.   

    我如果不注释的话,不会抛出异常,而是client信息收不到
      

  7.   


    public class Service {
        public static void main(String[] args) throws Exception {
            ServerSocket ss = new ServerSocket(8089);        while (true) {
                Socket incomming = ss.accept();
                InputStream in = incomming.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                OutputStream out = incomming.getOutputStream();
                PrintWriter pw = new PrintWriter(out, true);
                pw.write("service acceped!这是服务端发给客户端的");
                pw.flush();//刷新缓冲区
                // 关闭资源
               // 应为客户端和服务器端建立好连接后就会通过HTTP建立IO通道,当关闭某一方的输入和输出流
                //都会导致对方IO通道中断,并抛出异常,Socket通信中一旦建立了IO连接,就不能关闭(除非想断开IO)。
                //reader.close();
                pw.close();
                //in.close();
                out.close();
                incomming.close();
            }
        }
    }
      

  8.   

     // 关闭资源
               // 应为客户端和服务器端建立好连接后就会通过HTTP建立IO通道,当关闭某一方的输入和输出流
                //都会导致对方IO通道中断,并抛出异常,Socket通信中一旦建立了IO连接,就不能关闭(除非想断开IO)。
    你为什么只关闭输出而不关闭输入流
      

  9.   

    你没理解我的意思,输入和输出都不能关闭的,把你代码中关闭流的去掉,在通过输出流发送消息后flush一下,刷新缓冲区,这样可以在不关闭流的情况下将详细发送。
      

  10.   


    public class Service {
        public static void main(String[] args) throws Exception {
            ServerSocket ss = new ServerSocket(8089);        while (true) {
                Socket incomming = ss.accept();
                InputStream in = incomming.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                OutputStream out = incomming.getOutputStream();
                PrintWriter pw = new PrintWriter(out, true);
                pw.write("service acceped!这是服务端发给客户端的");
                pw.flush();//刷新缓冲区
                // 关闭资源
               // 应为客户端和服务器端建立好连接后就会通过HTTP建立IO通道,当关闭某一方的输入和输出流
                //都会导致对方IO通道中断,并抛出异常,Socket通信中一旦建立了IO连接,就不能关闭(除非想断开IO)。
       
            }
        }
    }好吧!我把代码给你写全吧,把你原来的所有关闭方法去掉,然后添加红色部分的代码就OK了。
      

  11.   

    pw.flush();
    就是这一句。。
      

  12.   

    我PrintWriter(out, true),他应该是自动flush才对啊,而且我想知道为什么我关闭输出流是可以发送的,就是输入流不可以关闭
      

  13.   

    autoFlush - boolean 变量;如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区
    这个是我的错。我还是那个问题:
    什么我关闭输出流是可以发送的,就是输入流不可以关闭
      

  14.   


    因为你先关闭的输入流( reader)啊,这个时候socket就关闭了,但信息还没有发出去呢。
                pw.write("service acceped!这是服务端发给客户端的");
                // 关闭资源
                reader.close();//这将导致incomming被关闭,你应该先关闭pw或者out,再关闭reader
                pw.close();
                in.close();
                out.close();
                incomming.close();不过我比较奇怪,你先关闭reader,客户端不报错吗?