2012-05-26 24 views
1

我正在使用簡單的套接字連接進行聊天室。 我有一個服務器和客戶端程序。該服務器在端口225上運行,然後當我在端口225上運行的客戶端,以便他們可以讀/寫插槽,客戶立即與錯誤消息Java聊天室 - 爲什麼我得到一個SocketException?

java.net.SocketException: Connection resetJava Result: 1 

爲什麼拋出此異常停止?如圖所示:

try { 
    client = new Socket(serverAdress, portNumber); 
    System.out.println("Successful connection to server on port " + portNumber + "."); 

那麼爲什麼它不能連接呢?

這是異常跟蹤...

java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(SocketInputStream.java:168) 
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) 
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) 
at java.io.InputStreamReader.read(InputStreamReader.java:167) 
at java.io.BufferedReader.fill(BufferedReader.java:136) 
at java.io.BufferedReader.readLine(BufferedReader.java:299) 
at java.io.BufferedReader.readLine(BufferedReader.java:362) 
at schoolroom10.SchoolRoomClient.SchoolRoomClientWindow.main(SchoolRoomClientWindow.java:85) 

這是我的服務器代碼...

public class SchoolRoomServer { 

    // 'server' will create the server over the local port: 
    static ServerSocket serverSocket = null; 

    //Socket for listening: 
    static Socket clientcommunicate = null; 

    //portnum is the number of the local port. Change to required port before running. 
    static int portnum = 225; 

    public static void main(String[] args) throws IOException{ 
     try { 
      serverSocket = new ServerSocket(portnum); 
     clientcommunicate = serverSocket.accept(); 
      Communicate c = new Communicate(Communicate.server); 
      Thread t = new Thread(c); 
      t.start(); 
     } catch (UnknownHostException uhe) { 
      System.err.println(uhe); 
      System.exit(1); 
     } catch (IOException ioe) { 
      System.err.println(ioe); 
      System.exit(1); 
     } 


    } 
} 

class Communicate implements Runnable { 
    public static Socket server; 
    Communicate(Socket server) { 
     Communicate.server = server; 
    } 
    public void run() { 
     String in = ""; 
     try { 
      //i/o for clients: 
      PrintStream output = new PrintStream(server.getOutputStream()); 
      BufferedReader input = new BufferedReader(new InputStreamReader(server.getInputStream())); 
      String message; 

      //Message handling: 
      while(((message = input.readLine()) != null) && (!in.equals("."))) { 
       output.println(message); 
      } 
     } catch (IOException ioe) { 
      System.err.println(ioe); 
     } 
    } 
} 
+1

請寫滿堆棧跟蹤。 –

+0

「服務器」在Communicate類中不應該是靜態的。 – EJP

回答

0

「連接復位」通常意味着您已寫入到已經被連接由另一端關閉。一般來說這是一個應用程序協議錯誤。但是在某些情況下,例如對方是瀏覽器的地方,或者也可能是你的情況,這只是對方可能隨時選擇離開的事實的必然結果。在這些情況下,您只能關閉套接字並忘記連接。

2

正如前面的海報所指出的那樣,你應該因爲這些被保留避免使用低於1024的端口。

沒有看到所有的代碼剩下的只是猜測,但是在客戶端,你應該會進入一個循環,不斷從輸入流和處理傳入的消息,則重複前一個短暫的停頓,例如準備睡眠(100)。同一服務器端用於監視連接請求和傳入消息。

如果你不保持讀取輸入流,它將填補緩衝區並放棄與異常的連接。