从服务器获取信息的线程被阻止

时间:2015-08-11 10:40:07

标签: java multithreading

我开发了一个向客户端发送请求的客户端。当请求将被发送时,将从服务器听到的客户端启动一个线程。出于模拟目的,我阻止了服务器的响应,因此线程将运行并尝试从服务器收听。但我的线程没有反应。这是一些代码:

void getResponse(){
    System.out.println("###always hearing###");
    BufferedReader bStreamReader=null;

    try {
        bStreamReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String responseLine=null;
        System.out.println("--------------------------------------------");
        while((responseLine=bStreamReader.readLine())!=null){

            getResponse_status=true;
            System.out.println("getResponse_status: "+getResponse_status);
            System.out.println(responseLine);
        }
        System.out.println("--------------------------------------------");
        System.out.println("client:reading from server finished");
        bStreamReader.close();
        System.out.println("###finish hearing###");
        //System.exit(0);
    } catch (IOException e){
        e.printStackTrace();
    }   
}
@Override
public void run() { 
    //run method of thread
    getResponse();
}

//

getResponse() - 方法将在while循环中被阻止。通常,如果服务器不发送任何内容,则变量responseLine将等于null。这意味着while循环不会被执行,因为执行的条件不是真的。但getResponse()将在while循环中被阻止。我确定服务器什么都不发送。那么为什么我的程序在while循环中被阻止了?

1 个答案:

答案 0 :(得分:1)

readline阻塞,直到收到一些数据。当它收到end-of-input个字符时,它会返回null并跳出循环。当你发送任何东西时,它一直在等待这是正确的。

请参阅https://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html

  

readLine方法等待,直到服务器回显信息   到EchoClient。当readline返回时,EchoClient打印出   信息到标准输出。

     

while循环继续,直到用户键入输入结束   字符。

你的情况几乎一样。从服务器发回一些东西,看它是否有所不同。我相信它确实如此。

修改

我的建议是给客户。在您的代码中执行以下操作:

socket.setSoTimeout(5000); // Set read timeout to 5 seconds

在致电此行之前:

bStreamReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));

执行此操作后,如果服务器在5秒内没有响应,您将获得java.net.SocketTimeoutException: Read timed out异常,从而打破周期。如果将其括在try-catch中,那么就完成了。