2015-10-26 41 views
-1

UPDATE:SocketTimeoutException在客戶端的readLine()方法AWS

我注意到,它工作正常在Windows機器上,但它在Mac上失敗。

我爲套接字連接創建了一個基本的Java Server代碼。它運行在AWS Linux AMI上,並通過我的電腦建立客戶端連接。它適用於客戶的前4-5個答案。但是,在第四或第五回答後,我沒有收到服務器的任何迴應,只是掛起。過了一段時間,它會給出SocketTimeout異常。

我使用setSoTimeout()在兩側設置套接字超時,並且它沒有改變任何東西。我想知道它與亞馬遜有什麼關係。

客戶端代碼:

public static void main(String[] args) { 
    final int portNumber = 9090; 
    String connected = "1"; 
    System.out.println(WELCOME); 

    try { 
     Socket socket = new Socket("ip", portNumber); 
     socket.setSoTimeout(0); 
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
     BufferedReader input = new BufferedReader(
       new InputStreamReader(socket.getInputStream())); 
     out.println(connected); 
     while (connected.equals("1")) { 
      //read in situation 
      String situation = readInSituation(socket, input).replace(DELIMETER, "\n"); 
      System.out.println(situation); 

      //send option 
      Scanner in = new Scanner(System.in); 
      System.out.print("Enter option: "); 
      out.println(in.nextLine()); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private static String readInSituation(Socket socket, BufferedReader input) throws Exception { 
    while (!input.ready()) { 
     Thread.sleep(200); 
    } 
    return input.readLine(); 
} 

服務器代碼更復雜,但它所做的就是響應命令,並在屏幕上打印基本的文本。

感謝

回答

0

不要使用PrintWriter在網絡上,因爲它吞下例外,最可能是之前「連接復位」。使用BufferedWriter。注意:ready()循環實際上是浪費時間。