java - 在 Android 上使用 BufferedReader 时导致 java.net.SocketTimeoutException 的原因是什么?

标签 java android xml bufferedreader socket-timeout-exception

我在 Android 应用程序中使用 BufferedReader 从网络服务器检索 XML 文件。我目前拥有的代码可以与许多其他文件一起使用。然而,对于这个特定的文件,我收到了 SocketTimeoutException。下面是我的代码:

socket = new Socket();
socket.connect(new InetSocketAddress(address, intPort), 5000);
String data;
socket.setSoTimeout(5000); //timeout after X milliseconds
dos = new DataOutputStream(socket.getOutputStream());
dis = new BufferedReader(new InputStreamReader(socket.getInputStream()));
dos.write(requestmsg.getBytes());
dos.flush();
StringBuilder sb = new StringBuilder();
while ((data = dis.readLine()) != null)
    sb.append(data);

returnData = sb.toString();

当我查看 dis 的缓冲区时,我可以看到整个文件:

Screenshot of the buffer

但是在读了这么多之后它抛出了异常:

HTTP/1.1 200 OKCache-Control: no-storeContent-Type: text/xmlContent-Length: 215

这是我试图读入的文件:

<?xml version="1.0" encoding="ISO-8859-1"?><datavalues>...</datavalues>

这是我的 logcat 错误输出:

11-05 08:22:41.551 3750-3779/ W/System.err: java.net.SocketTimeoutException
11-05 08:22:41.553 3750-3779/ W/System.err:     at java.net.PlainSocketImpl.read(PlainSocketImpl.java:492)
11-05 08:22:41.555 3750-3779/ W/System.err:     at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
11-05 08:22:41.556 3750-3779/ W/System.err:     at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:241)
11-05 08:22:41.558 3750-3779/ W/System.err:     at java.io.InputStreamReader.read(InputStreamReader.java:233)
11-05 08:22:41.560 3750-3779/ W/System.err:     at java.io.BufferedReader.fillBuf(BufferedReader.java:145)
11-05 08:22:41.562 3750-3779/ W/System.err:     at java.io.BufferedReader.readLine(BufferedReader.java:397)    
…
11-05 08:22:41.568 3750-3779/ W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:288)
11-05 08:22:41.570 3750-3779/ W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-05 08:22:41.572 3750-3779/ W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
11-05 08:22:41.573 3750-3779/ W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
11-05 08:22:41.574 3750-3779/ W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
11-05 08:22:41.575 3750-3779/ W/System.err:     at java.lang.Thread.run(Thread.java:841)

我不确定问题是否出在 XML 文件中,或者是否需要更改代码中的某些内容。

最佳答案

在读取传入数据之前,您可以通过 isConnected 检查套接字是否已连接方法

就你的情况

if(socket.isConnected()){
// read  output stream socket.getOutputStream()
}else{
 // make another try ...  
 }

关于java - 在 Android 上使用 BufferedReader 时导致 java.net.SocketTimeoutException 的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549127/

相关文章:

android - 覆盖 fragment 中的 setOnClickListener 停止工作

xml - 使用XQuery得到不正确的结果?

java - spring boot 服务器 + java 客户端

android - 将消息从 Activity 发送到服务 - Android

java - 像 java.awt.Robot 这样的 Android API

html - 在 ColdFusion 中解析文件夹中的日志文件

java - 仅使用 Java5 的 XML 到 Java 对象(无外部库)

java - 有没有办法合并这2个?

java - 如何为 Axiom XPath 设置变量上下文

java - 如何使用 preparedStatement 插入 last_insert_id?