当前位置: 首页 > 面试题库 >

如何在Java 1.4中的BufferedReader和PrintWriter上设置超时?

邢项禹
2023-03-14
问题内容

如何在使用套接字连接创建的BufferedReader和PrintWriter上设置超时?这是我现在为服务器提供的代码,该代码将一直工作到服务器或客户端崩溃为止:

while(isReceiving){
    str = null;
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);

    while ((str = br.readLine()) != null){
        System.out.println("Processing command " + str);
        pw.println(client.message(str));
    }
}

在此代码范围之外,我施加了1000ms的套接字超时,它在等待初始连接时按预期工作。但是该程序在(str =
br.readLine())处阻塞。如果客户端挂起或崩溃,则除非我终止该进程,否则它永远不会停止阻塞(即使那样也并不总是起作用)。

有问题的客户端代码与此非常相似,并且以类似的方式进行阻塞。


问题答案:

由于调用socket.close()似乎并未中断br.readLine()处的块,因此我做了一些解决方法。当断开客户端与服务器的连接时,我仅发送字符串“
bye”,并告诉服务器在收到此命令时关闭套接字连接。

while ((str = br.readLine()) != null){
    // If we receive a command of "bye" the RemoteControl is instructing
    // the RemoteReceiver to close the connection.
    if (str.equalsIgnoreCase("bye")){
        socket.close();
            break;
    }
    System.out.println("Processing command " + str);
    pw.println(client.message(str));
}


 类似资料:
  • 问题内容: 我正在尝试在使用http.request且没有运气的HTTP客户端上设置超时。到目前为止,我所做的是: 有什么提示吗? 问题答案: 现在可以使用option和相应的request事件:

  • 我在我的项目中设置了一个RestTemplate和一个AsyncRestTemplate,如下所示: 我注意到连接超时实际上并不起作用,除非我将httpRequestFactory()bean更改为如下所示: 如果我将DEFAULT_READ_TIMEOUT_MILLISECONDS设置为5,则当我使用restTemplate时会发生超时(正如预期的那样)。但是,当我使用AsyncRestTemp

  • Spring docs表示,需要手动为WebClient配置http客户机以设置超时:https://docs.Spring.io/Spring/docs/current/spring-framework-reference/web-reactive.html#webflux-client-builder-reactor-timeout。但是,由于WebClient返回反应单声道,所以可以(在AP

  • 问题内容: 我org.springframework.ws.client.core.WebServiceTemplate用于拨打Web服务。如何为通话配置超时。 问题答案: 如果你使用的是Spring Webservices 2.1.0版本,则可以使用HttpComponentsMessageSender设置超时。 Spring不推荐使用CommonsHttpMessageSender,因此不再推

  • 我正在尝试在我的WebClient上设置超时,以下是当前代码: 我需要添加超时和池策略,我在想这样的事情: 但是我不知道如何在我的webclient中设置httpClient

  • 我有一些可能需要一段时间才能执行的REST API,我想限制它们的执行持续时间。优选地,如果30秒过去了并且请求没有返回,我希望返回特定的HTTP代码/数据并完全终止该请求。 当前代码: