2011-11-24 63 views
4

我想創建能夠與多個客戶端連接的服務器。 我的主要功能是:套接字例外:套接字已關閉

ServerSocket serverSocket = null; 
    try { 
     serverSocket = new ServerSocket(5556); 
    } catch (IOException ex) { 
     Logger.getLogger(MakaoServer.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    while (true) { 
     try { 
      Socket connection = serverSocket.accept(); 
      PlayerConnection playerConn = new PlayerConnection(connection); 
      playerConn.start(); 
     } catch (IOException ex) { 
      System.out.println("Nie można było utworzyć gniazda."); 
     } 
    } 

PlayerConnection是一個Thread類。 run方法:

public void run() { 
    InputStream input = null; 
    while (true) { 
     try { 
      input = connection.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 
      String msg = reader.readLine(); 
      System.out.println(msg); 

     } catch (IOException ex) { 
      Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, null, ex); 
     } finally { 

     } 
    } 
} 

當我運行客戶端和發送消息給它接收的服務器,但是,接下來將在循環迭代connection.getInputStream();拋出一個Socket異常套接字被關閉。爲什麼?

java.net.SocketException: socket closed 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(SocketInputStream.java:150) 
at java.net.SocketInputStream.read(SocketInputStream.java:121) 
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283) 
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) 
at java.io.InputStreamReader.read(InputStreamReader.java:184) 
at java.io.BufferedReader.fill(BufferedReader.java:154) 
at java.io.BufferedReader.readLine(BufferedReader.java:317) 
at java.io.BufferedReader.readLine(BufferedReader.java:382) 
at makaoserver.PlayerConnection.run(PlayerConnection.java:38) 
+0

你讀循環應該結束的時候'的readLine()''返回null'。目前,當對端關閉連接時,您會收到無盡的'null'消息。 – EJP

回答

6

將輸入流和緩衝讀取器放在循環之外。

可能創建多個流連接到相同的輸入流造成這種情況。

+0

但我想從客戶端獲得多條消息。如果你把輸入流和緩衝閱讀器放在循環之外,我只會得到一條消息。 – latata

+0

沒有一次你有輸入流的句柄,你不需要繼續初始化它。你的readline仍然會在循環中收集消息。 –

+0

我得到相同的異常:( – latata

0

嘗試

public void run() { 
    InputStream input = null; 
    input = connection.getInputStream(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 

    while (true) { 
     try { 
      String msg = reader.readLine(); 
      System.out.println(msg); 
     } catch (IOException ex) { 
      Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, null, ex); 
     } finally { 

     } 
    } 
} 

另外不要忘記關閉插座,當你與他們做

try { 
    // Create objects 
    // do stuff 
} finally { 
    if (obj != null) obj.close(); 
} 
+0

我已經完成了它,但我仍然得到相同的異常 – latata

+0

您說過連接關閉的異常在第二遍循環中的connection.getInputStream()上拋出,該行不再在循環中,現在拋出的異常在哪裏呢?你還可以爲你展示一些來自PlayerConnection的代碼可能會關閉服務器端的連接。 –

+1

我解決了這個問題。 :)我正在打開一個OutputStream也引起異常。 – latata