2015-10-26 39 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()循环实际上是浪费时间。