Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
线程挂起在socketRead0 Java中_Java_Sockets - Fatal编程技术网

线程挂起在socketRead0 Java中

线程挂起在socketRead0 Java中,java,sockets,Java,Sockets,基本上,我正在尝试下载网页的HTML内容。方法非常简单 HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); BufferReader in = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream())); String line;

基本上,我正在尝试下载网页的HTML内容。方法非常简单

        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
        BufferReader in = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
        String line;
        StringBuilder pageBuilder = new StringBuilder();
        while ((line = in.readLine()) != null) {
            pageBuilder.append(line + "\n");
        }
但有时程序只是挂起。我试图进行调试,线程堆栈跟踪告诉我,当调用方法SocketRead0时,它挂起。我试图为连接设置readtimeout,但它不起作用。关于如何检测并通过SocketRead0块有什么想法吗

编辑:我实际遇到的问题似乎是getReponseCode隐式调用了一些getInputStream和一些read()方法,然后挂起在readSocket0()。我是否可以确保对getReponseCode()的调用是安全的? 下面是一个挂起线程的堆栈跟踪:级别0是最近的调用

thread 24stacktrace
        At 0level
        at method socketRead0
        at line -2
        At 1level
        at method read
        at line 129
        At 2level
        at method fill
        at line 218
        At 3level
        at method read1
        at line 258
        At 4level
        at method read
        at line 317
        At 5level
        at method parseHTTPHeader
        at line 687
        At 6level
        at method parseHTTP
        at line 632
        At 7level
        at method getInputStream
        at line 1200
        At 8level
        at method getResponseCode
        at line 379
        At 9level
        at method pushFinalRedirectedURL
        at line 132
        At 10level
        at method process
        at line 134
        At 11level
        at method run
        at line 40

套接字读取是一种阻塞操作。它将阻塞,直到有更多数据、流结束或连接关闭。

套接字读取是一种阻塞操作。它将阻塞,直到有更多数据、流结束或连接关闭。

在调用readline函数之前,需要确保缓冲区中有要读取的数据。正如Peter提到的,SocketRead是一个阻塞函数,这意味着当调用它时,它将一直等待,直到数据被放到流中

试试这个:

while (in.ready()) {
    line = in.readLine();
    pageBuilder.append(line + "\n");
}

是指向BufferedReader API的链接

在调用readline函数之前,需要确保缓冲区中有要读取的数据。正如Peter提到的,SocketRead是一个阻塞函数,这意味着当调用它时,它将一直等待,直到数据被放到流中

试试这个:

while (in.ready()) {
    line = in.readLine();
    pageBuilder.append(line + "\n");
}

是指向BufferedReader API的链接

只是对前面关于套接字读取被阻塞的回答的补充: 如果方法
私有本机int-socketRead0(文件描述符fd,字节b[],int-off,int-len,int-timeout)引发IOException

获取超时0(默认值),不使用超时。因此,它可以阻止而不是抛出IOException。

只是对前面关于套接字读取被阻止的答案的补充: 如果方法
私有本机int-socketRead0(文件描述符fd,字节b[],int-off,int-len,int-timeout)引发IOException

获取超时0(默认值),不使用超时。因此,它可以阻止而不是抛出IOException。

我也有这个错误,并解决了它。出现此问题的原因是,有时软件试图打开与服务器的连接,但不发送响应,但也不给出错误

软件仍在等待服务器应答,但它从未出现

为了避免这种情况,您需要使用
setConnectTimeout()
方法,因此如果服务器在确定的时间内没有发送应答,连接将中止


我也有这个错误,并解决了它。出现此问题的原因是,有时软件试图打开与服务器的连接,但不发送响应,但也不给出错误

软件仍在等待服务器应答,但它从未出现

为了避免这种情况,您需要使用
setConnectTimeout()
方法,因此如果服务器在确定的时间内没有发送应答,连接将中止


谢谢你的解释。您还可以解释为什么setReadTimeOut()不起作用吗。因为我的线程挂起意味着还有更多的数据,而且它还没有结束。setReadTimeout()只在开始时起作用,这是真的吗。我的意思是,如果在超时时间内read()开始时收到了一些数据,那么这是正常的,即使没有收到更多的数据,线程也会挂起并等待。是吗?谢谢你的解释。您还可以解释为什么setReadTimeOut()不起作用吗。因为我的线程挂起意味着还有更多的数据,而且它还没有结束。setReadTimeout()只在开始时起作用,这是真的吗。我的意思是,如果在超时时间内read()开始时收到了一些数据,那么这是正常的,即使没有收到更多的数据,线程也会挂起并等待。是吗?谢谢russel,现在我似乎对getReponseCode()有问题了。请参阅我的编辑..这将在没有数据准备就绪时截断文件(可能为零)。这将防止阻塞,但可能也会阻止加载文件。@Peter你说得对,他的原始代码似乎也是这样,所以我认为这不是问题@User304462我不知道答案,我唯一能建议的就是检查api,看看这是否有帮助。关于截断问题有什么建议吗?下载网页HTML内容的最佳方式是什么?谢谢russel,现在我似乎对getReponseCode()有问题。请参阅我的编辑..这将在没有数据准备就绪时截断文件(可能为零)。这将防止阻塞,但可能也会阻止加载文件。@Peter你说得对,他的原始代码似乎也是这样,所以我认为这不是问题@User304462我不知道答案,我唯一能建议的就是检查api,看看这是否有帮助。关于截断问题有什么建议吗?下载网页HTML内容的最佳方式是什么?作为补充说明,该代码可能会损坏下载的网页。您应该使用网页的字符集来正确配置InputStreamReader。请注意,该代码可能会损坏下载的网页。您应该使用网页的字符集来正确配置InputStreamReader。