AWS上的客户端readLine()方法中的SocketTimeoutException

时间:2015-10-26 01:19:24

标签: java sockets amazon-web-services timeout client

更新

我注意到它在Windows机器上工作正常,但在Mac上失败了。

我为套接字连接创建了一个基本的Java Server代码。它在AWS Linux AMI上运行,我从我的计算机建立客户端连接。它适用于客户端的前4-5个答案。但是,在第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();
}

服务器代码更复杂,但它只是响应命令并在屏幕上打印基本文本。

由于

1 个答案:

答案 0 :(得分:0)

不要在网络上使用PrintWriter,因为它会吞下异常,很可能是之前的'连接重置'。使用BufferedWriter。注意ready()循环实际上是浪费时间。