2013-10-24 208 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(); 

,然後嘗試..