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