我正在创建一个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()是一个阻塞命令,那么一切都会很完美。有什么解决方法吗?
答案 0 :(得分:1)
InputStreams
在读取方法中已经阻止,但没有数据可用。
您不需要围绕这些available()
来电或循环中的一个。
您还应注意,Socket.isClosed()
仅在您关闭套接字时才返回true。它并不能判断对等方是否已关闭连接。