【问题标题】:Android socket always ending in timeoutAndroid套接字总是以超时结束
【发布时间】:2026-01-16 03:40:01
【问题描述】:

我为 android 2.3.3 制作了一个 android socket 客户端应用程序。 它发送一个 XML 请求,然后从 cobol 套接字服务器收到一个回复​​。

应用程序工作得很好,我的问题是,一旦我的客户端应用程序读取了所有数据,它仍然挂起,等待超时限制出于某种原因。

代码如下:

Socket socket = new Socket(serverIpAddress, serverPort);
socket.setSoTimeout(2000);

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

String request = ("Some XML Request");
out.println(request);
out.flush();

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Log.d("Nicklas", "Reader Oprettet");
Vector<String> v = new Vector<String>();
int i = 0;
Boolean KeepGoing = true;
while (KeepGoing)
{

    try 
    {
        String lol = in.readLine();
        if (lol == null) { KeepGoing = false; }
        v.add(new String(lol));
        i++;
    }
    catch (Exception e)
    {
        Log.d("NickEEEXX", e.toString());
        KeepGoing = false;
    }                       
} 

它总是以 catch 结束,除了“java.net.SocketTimeoutException”——即使它已经发送和接收了正确的数据。这会大大降低程序的速度。

我将此代码作为方法而不是线程运行,因为我需要在本节中更改 GUI。

有没有人知道它为什么要等待超时?

【问题讨论】:

    标签: java android sockets timeout connection


    【解决方案1】:

    当没有更多数据时,lol 可能不是 null。尝试检查一个空白字符串。

    【讨论】:

    • 我试过 'if (lol == "") { KeepGoing = false; }' 也一样,没有区别。
    • **我想出了一种方法来解决这个问题。我得到的 XML 回复总是以 结尾,所以我只是询问 lol(readline 的变量)是否包含它。 **
    • 你知道你不能在字符串上做'=='运算符,对吧?我有时也会想念。
    • 但是你是对的,知道结束标签并检查你是否有这个非常有意义。