如何在Java套接字上超时读取?

2022-09-02 01:28:34

我正在尝试从套接字中读取项目,我注意到如果套接字流上没有任何内容,它将保留在读取并备份我的应用程序。我想知道是否有办法设置读取超时或在套接字中没有任何东西的一定时间后终止连接。


答案 1

如果你编写 Java,学习导航 API 文档会很有帮助。在套接字读取的情况下,您可以设置超时选项,例如:

socket.setSoTimeout(500);

这将导致与套接字关联的在调用块后抛出半秒钟。重要的是要注意,在此类调用引发的异常中是唯一的,因为套接字仍然有效;您可以继续使用它。异常只是一种逃避读取并决定是否该执行不同操作的机制。InputStreamSocketTimeoutExceptionread()SocketTimeoutExceptionread()

while (true) {
    int n;
    try {
        n = input.read(buffer);
    catch (SocketTimeoutException ex) {
        /* Test if this action has been cancelled */
        if (Thread.interrupted()) throw new InterruptedIOException();
    }
    /* Handle input... */
}

答案 2

如果此套接字是通过 执行 Web 请求创建的,则可以在读取流之前直接在 上设置读取和连接超时:URLConnectionURLConnection

InputStream createInputStreamForUriString(String uriString) throws IOException, URISyntaxException {
    URLConnection in = new URL(uriString).openConnection();
    in.setConnectTimeout(5000);
    in.setReadTimeout(5000);
    in.setAllowUserInteraction(false);
    in.setDoInput(true);
    in.setDoOutput(false);
    return in.getInputStream();
}

推荐