2014-05-15 24 views
0

我是新來的Java編程中的套接字編程,所以面臨一個問題似乎並不困難,但由於不熟悉而無法解決。以下是客戶端和服務器的代碼。面對Java中關閉客戶端的異常

服務器代碼:

public class connectionServer { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    // TODO code application logic here 
    String clientSentence; 
    String capitalizedSentence; 
    BufferedReader inFromClient; 
    DataOutputStream outToClient; 
    BufferedReader inFromUser; 

    try { 
     ServerSocket welcomeSocket = new ServerSocket(70); 
     Socket connectionSocket; 
     connectionSocket = welcomeSocket.accept(); 
     System.out.println("Connection accepted for " + connectionSocket.getInetAddress() + ": " + connectionSocket.getPort()); 
     InputStreamReader input = new InputStreamReader(connectionSocket.getInputStream()); 
     inFromClient = new BufferedReader(input); 



     while (true) 
     {   

      if(input.ready()) 
      { 
       clientSentence = inFromClient.readLine();     
       System.out.println(clientSentence); 
      } 

      String tempString = "FROM SERVER: What's problem......"; 

      try 
      { 
       Thread.currentThread().sleep(1000); 
      } 
      catch(Exception e) 
      { 
       System.out.println(e); 
      } 

      outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
      if(outToClient != null) 
      { 
       outToClient.writeBytes(tempString + "\n"); 
       outToClient.flush(); 

      } 
     } 
    } 
    catch (IOException e) 
    { 
     System.out.println(e); 
     e.printStackTrace(); 
    } 
} 

}

客戶端代碼:

public class connectionClient { 

static Socket clientSocket = null; 
////////////////////////////////////////// 

////////////////////////////////////////// 
/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    // TODO code application logic here 
    String sentence; 
    String modifiedSentence; 
    attachShutDownHook(); 
    try 
    { 
     clientSocket = new Socket("127.0.0.1", 70); 
     DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());; 
     BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     outToServer.writeBytes("FROM CLIENT 2: Hello \n\n"); 

     while(clientSocket.isConnected()) 
     {    

      sentence = "Please reply me...."; 
      try 
      { 
       Thread.currentThread().sleep(1000); 
      } 
      catch(Exception e) 
      { 
       System.out.println(e); 
      } 
      if(inFromServer.ready()) 
      { 
       modifiedSentence = inFromServer.readLine(); 
       System.out.println(modifiedSentence); 
      } 
      outToServer.writeBytes("FROM CLIENT 2:" + sentence + "\n"); 
      outToServer.flush(); 
     } 

    } 
    catch(IOException e) 
    { 
     System.out.println(e); 
    } 
    finally 
    { 
     System.exit (0) ; 
    } 
} 

}

當我停止以下異常客戶端被扔在服務器端

java.net.SocketException: Connection reset by peer: socket write error 
    java.net.SocketException: Connection reset by peer: socket write error 
at java.net.SocketOutputStream.socketWrite0(Native Method) 
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) 
at java.net.SocketOutputStream.write(SocketOutputStream.java:132) 
at java.io.DataOutputStream.writeBytes(DataOutputStream.java:276) 
at connectionserver.connectionServer.main(connectionServer.java:57) 

在這方面的任何幫助將不勝感激。謝謝

回答

0

這通常意味着你已寫入到已被對等關閉的連接。換句話說,應用程序協議錯誤。

您的代碼需要工作。

  1. 不要使用ready():只要在read()中阻塞,直到數據到達。當ready()返回false時,你目前正在抽吸CPU。這可能會導致錯誤。

  2. 連接套接字後,isConnected()始終爲真。當同伴結束時,它不會神奇地返回錯誤。您必須通過EOS或例外來檢測。循環while(isConnnected())無效。

  3. 不要混合流和讀者和作家。您正在使用BufferedInputStream:在另一端使用BufferedWriter。

+0

謝謝!但沒有什麼可以在這裏工作 – Waqas

+0

@Wagas我不知道應該是什麼意思,但你的文章被稱爲'關閉客戶端的異常',並且你在服務器中寫入時得到它,它正好* *我所描述的條件。 – EJP