gpt4 book ai didi

java - 阻塞直到 DataInputStream 可用

转载 作者:太空宇宙 更新时间:2023-11-04 06:22:26 30 4
gpt4 key购买 nike

我正在为我正在参加的类(class)制作一个 HTTP 服务器作为项目,一周来我一直在尝试寻找解决方案。我有一个 DataInputStream,我需要等待客户端向我发送 http 请求,由于连接保持打开状态,可能需要几个小时才能发生这种情况。这是我的代码

    DataInputStream dis=new DataInputStream(socket.getInputStream());
DataOutputStream dos =new DataOutputStream(socket.getOutputStream());

while(!socket.isClosed()){
try{
/**wait until there are new data in to the stream,if the connection is no more alive then close it*/
while(dis.available()==0){
if(alive==false){
socket.close();
break;
}
}

/*at this point the stream has new data ,or the alive attribute has been set to false */
if(!socket.isClosed()){
/*parse the request text */
Request request=new Request(dis,this);

/*generate a response based on the request*/
Response response=new Response(request,this);

/*send the response back to the client*/
response.send(dos);

/*log the details of the communication*/
Logger.log(toString(request,response,socket));

/*if the request is bad formatted or it has its Connection header set to close , close the connection after sending the response*/
if(request.isBadRequest() || !"keep-alive".equalsIgnoreCase(request.getHeader("Connection"))){
close();
}
}
} catch (IOException e) {
e.printStackTrace();
break;
}
}

while(dis.available()==0)部分,我正在等待流获得一些数据,但问题是,如果我有很多连接,我的服务器开始获得大量CPU时间,从而减慢我的计算机速度,因为它只是一次又一次地挂起循环,不给CPU机会进行良好的调度。如果dis.available()是一个阻塞命令,那么一切都会很完美。有什么解决方法吗?

最佳答案

InputStreams 已经在没有数据可用时阻塞在读取方法中。

您不需要这些 available() 调用或它们周围的循环。

您还应该注意,Socket.isClosed() 仅在关闭套接字时才返回 true。它不会告诉对方是否已关闭连接。

关于java - 阻塞直到 DataInputStream 可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27275163/

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