阻止,直到DataInputStream可用

时间:2014-12-03 15:12:19

标签: java inputstream serversocket

我正在创建一个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()是一个阻塞命令,那么一切都会很完美。有什么解决方法吗?

1 个答案:

答案 0 :(得分:1)

InputStreams 在读取方法中已经阻止,但没有数据可用。

您不需要围绕这些available()来电或循环中的一个。

您还应注意,Socket.isClosed()仅在关闭套接字时才返回true。它并不能判断对等方是否已关闭连接。