繁体   English   中英

如何超时读取Java Socket?

[英]How to timeout a read on Java Socket?

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

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

socket.setSoTimeout(500);

这将导致与套接字关联的InputStreamread()调用阻塞半秒后抛出SocketTimeoutException 需要注意的是SocketTimeoutException在此类read()调用抛出的异常中是唯一的,因为套接字仍然有效; 你可以继续使用它。 异常只是一种逃避读取并决定是否该做一些不同的事情的机制。

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... */
}

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

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();
}

是的,应该有一个接受超时值的 Read() 覆盖。 通过“覆盖”,我不是建议任何人一个,我是指出他正在使用的套接字方法的覆盖之一采用超时值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM