【问题标题】:Java readByte() blocks the applicationJava readByte() 阻塞应用程序
【发布时间】:2011-01-28 14:14:33
【问题描述】:

如果客户端突然断开连接并引发 EOF 异常,则以下循环似乎阻塞了整个服务器应用程序:

String a = "";
int amount = 1;
while(((cr = streamIn.readByte()) != EOF))
{
 if(amount < 100)
 {
  a+=(char)cr;
  amount++;
 }
 else
  break;
}

根据功能描述: readByte():接收一个字节。该方法将阻塞,直到数据可用。

问题是,我怎样才能让它超时,所以它最多只能阻塞几秒钟?

【问题讨论】:

  • 如何获得streamIn?是原始套接字吗?来自 Servlet 的流?还有什么?

标签: java timeout


【解决方案1】:

你试过设置Socket.setSoTimeout()

【讨论】:

  • 是的,这将完全退出应用程序,如果没有发生任何事情,我只希望它在一个客户端上等待太久时停止从套接字读取,但仍然听新的连接,所以它可以重新开始阅读
  • 它不会完全退出应用程序,除非您将 SocketException 一直抛出到应用程序的入口点(或者如果您做了一些像 System.exit 这样的坏事)。只需捕获 SocketException,记录它,然后正常继续。
  • @НоГеБаТоР,在这种情况下,捕获异常并关闭连接。
  • 谢谢,试过了,但是现在如果客户端空闲,它会断开连接:(我真的需要断开它,只有当它从客户端读取某些内容时才需要断开它,但是这样做的时间太长了
  • 无法知道何时开始读取实际数据,因此您无法确定读取需要多长时间。您可以计算在某个点之后获取数据需要多长时间,即一旦您看到 X,您预计 Y 在 N 秒内。是这个意思吗?
【解决方案2】:

那是什么服务器?我的意思是它阻塞了为突然掉线的客户端提供服务的线程......它仍然应该为其他客户端提供服务

【讨论】:

  • 它是多线程的,所以它为每个客户端生成新线程,我想和你一样,但是主线程的 jstack 说“阻塞”并指向它上面的 readByte()...所以只是想确保它没有,所以我决定添加一个计时器任务..也许它会有所帮助;)本质上我希望它是:while(NOT_TIMED_OUT){DO THE REST HERE}
【解决方案3】:

研究使用 inputStream.available() ,它返回可以在不阻塞的情况下检索的字节数。

(未经测试)示例:

String a = "";
int amount = 1;
int available = 0;
while(true){
    int available = streamIn.available();
    if(available <= 0){
        continue;
    }   
    byte cr = streamIn.readByte();
    if(cr == EOF){
        break;
    }
    if(amount < 100){
        a+=(char)cr;
        amount++;
    }else{
        break;
    }
}

【讨论】:

  • 我将循环改写为: int i = streamIn.available(); while(i>0 && i
  • 您想在循环内进行可用检查。我会用一个例子来更新答案。
  • 好吧!不错的,谢谢!这现在就像我想要的那样工作!非常感谢!
猜你喜欢
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2013-04-25
  • 2016-06-22
  • 1970-01-01
  • 2018-10-14
相关资源
最近更新 更多