Java Socket:当没有从服务器发送输出时,如何从服务器跳过读取行

时间:2014-03-08 05:53:33

标签: java sockets tcpclient

所以我有这个Java TCP套接字客户端应用程序。非常简单:

public class Main {

    public static void main(String argv[]) throws Exception {
        String hostName = "localhost";
        int portNumber = 5000;

        Socket echoSocket = new Socket(hostName, portNumber);
        PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

        String userInput;
        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);
            System.out.println("echo: " + in.readLine());
        }
        echoSocket.close();
    }
}

现在您可以在while循环中看到,当用户输入内容时。它被发送到服务器。然后客户端等待对服务器的响应。如果服务器只是回应客户端输入的内容,那么这非常有效!
“但是”当服务器没有响应任何东西时,我的程序就会挂起......等待来自服务器的输入永远。

所以我的问题是,如何修改代码,以便在服务器没有返回任何内容时,它不会停止?
我必须使用线程吗? 1,从阅读和发送客户端输入,另一个打印出来自服务器的响应?

1 个答案:

答案 0 :(得分:4)

您可以在套接字上使用setSoTimeout()

Socket echoSocket = new Socket(hostName, portNumber);
echoSocket.setSoTimeout(10000); // Readings are timeouting after 10 seconds

来自javadoc:

  

使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。如果将此选项设置为非零超时,则与此Socket关联的InputStream上的read()调用将仅阻止这段时间。如果超时到期,则引发java.net.SocketTimeoutException,尽管Socket仍然有效。在进入阻止操作之前,必须启用选项才能生效。超时必须> 0.超时为零被解释为无限超时。

     

<强>参数:

     

超时指定的超时,以毫秒为单位。

因此,当您阅读该行时,您可以这样做:

try {
    System.out.println("echo: " + in.readLine());
} catch (SocketTimeoutException ste) {
    // Do something
    System.out.println("nothing received");
}