gpt4 book ai didi

java - 为 InputStreamreader 变量设置超时

转载 作者:行者123 更新时间:2023-12-02 00:51:26 25 4
gpt4 key购买 nike

我有一个正在运行的服务器,它接受通过客户端套接字建立的连接,我需要从该客户端套接字读取输入,现在假设客户端打开了到我的服务器的连接,而不通过服务器的套接字输出流发送任何内容,在这种情况下,当我的服务器尝试通过客户端套接字的输入流读取输入时,将会抛出异常,但在抛出异常之前我想要一个 5 秒的超时,我该怎么做?目前,我的代码在服务器端的样子如下:

try 
{
InputStreamReader clientInputStream = new InputStreamReader(clientSocket.getInputStream());
int c;
StringBuffer requestBuffer = new StringBuffer();
while ((c = clientInputStream.read()) != -1)
{
requestBuffer.append((char) c);
if (requestBuffer.toString().endsWith(("\r\n\r\n")))
break;
}
request = new Request(requestBuffer.toString(), clientSocket);
}
catch (Exception e) // catch any possible exception in order to keep the thread running
{
try
{
if (clientSocket != null)
clientSocket.close();
} catch (IOException ex)
{
ex.printStackTrace();
}
System.err.println(e);
//e.printStackTrace();
}

最佳答案

教科书的答案是设置 soTimeout在你的 socket 上,你可以这样做。然而,这并不适用于所有情况。我的一个 friend 曾经通过拔出我的网线来演示这一点。我将 soTimeout 设置为 30 秒,但我的应用却永远卡在那里。

为了获得可靠的超时,最好将 I/O 分离到另一个线程上。如果线程在给定时间内没有返回响应,您可以尝试中断它,关闭流并最终销毁线程。这不会让你更进一步,但会尝试清理溪流。一旦发生超时,您将需要考虑当前通信丢失,重新建立连接并重新发送先前的命令以重复通信。一个command-pattern可以在这里提供帮助。如果命令是幂等的并且可以多次执行,那就容易得多。能够重复失败的请求可用于处理间歇性 I/O 错误。

关于java - 为 InputStreamreader 变量设置超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2869923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com