2013-10-24 209 views
5

我写了一个简单的服务器和客户端的例子如下。套接字关闭异常

客户:

  • 打开一个连接
  • 获取的OutputStream,写入流并关闭输出流
  • 获取InputStream和从流中读取。

    public class DateClient { 
    
    public static void main(String[] args) throws UnknownHostException, 
         IOException, InterruptedException { 
        Socket sock = new Socket("127.0.0.1", 6013); 
        OutputStream outputStream = sock.getOutputStream(); 
        InputStream inputStream = sock.getInputStream(); 
    
        System.out.println("" + outputStream + "-" + inputStream); 
    
        PrintWriter printWriter = new PrintWriter(outputStream, true); 
        printWriter.println("Hi Server"); 
    
        outputStream.close(); 
    
        System.out.println(sock.isConnected()); 
    
        BufferedReader bufferedReader = new BufferedReader(
          new InputStreamReader(inputStream)); 
        String line; 
        while ((line = bufferedReader.readLine()) != null) { // Exception 
         System.out.println(line); 
        } 
    
    } 
    
    } 
    

    获得以下插座闭合异常的客户:在这一点上

    public class DateServer { 
    public static void main(String[] args) throws InterruptedException { 
    ServerSocket serverSocket = null; 
    Socket client = null; 
    try { 
        serverSocket = new ServerSocket(6013); 
        while (true) { 
         client = serverSocket.accept(); 
         OutputStream outputStream = client.getOutputStream(); 
         InputStream inputStream = client.getInputStream(); 
    
         System.out.println("" + outputStream + "-" + inputStream); 
    
         BufferedReader bufferedReader = new BufferedReader(
           new InputStreamReader(inputStream)); 
    
         String line = null; 
         while ((line = bufferedReader.readLine()) != null) { 
          System.out 
            .println("Message recieved from client ::" + line); 
         } 
    
         PrintWriter printWriter = new PrintWriter(outputStream, true); 
    
         printWriter.println(new java.util.Date().toString()); 
    
         client.close(); 
        } 
    } catch (IOException exception) { 
        exception.printStackTrace(); 
        System.err.println(exception); 
    } 
        } 
    
        } 
    

客户端获取异常。请让我知道是什么原因。

Exception in thread "main" java.net.SocketException: Socket closed 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(SocketInputStream.java:146) 
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:282) 
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:324) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:176) 
at java.io.InputStreamReader.read(InputStreamReader.java:184) 
at java.io.BufferedReader.fill(BufferedReader.java:153) 
at java.io.BufferedReader.readLine(BufferedReader.java:316) 
at java.io.BufferedReader.readLine(BufferedReader.java:379) 
at edu.iub.cs.httpserver.DateClient.main(DateClient.java:32) 

回答

6

java.net.SocketException异常关闭套接字 此异常意味着你关闭套接字,然后继续尝试使用它。

os.close(); 

然后你在这里关闭它。关闭Socket的输入或输出流会关闭另一个流和Socket。

+1

但是'的System.out.println(sock.isConnected());'是印刷真实 – Abhilash

+1

@Abhilash无关。 'isConnected()'告诉你是否曾经连接过'Socket.' *** Not ***它是否已经连接。 ('isConnected()'和'isClosed()'方法关于* socket的状态,*不是连接的状态。) – EJP

0

java.net.SocketException仅当您在从服务器读取数据之前关闭OutputStream(或)Socket时才会出现。

从您的代码,删除:

OutputStream.close(); 

,然后尝试..