Android客户端无法获得服务器回复

时间:2014-02-22 00:59:14

标签: android client-server

我有一个Android客户端,它将数据发送到Java服务器。在一些服务器进程之后,我希望服务器回复客户端,但我无法开始工作。

首先,客户端和服务器都卡在readLine()上,所以我向两者添加了\n但仍然没有变化。经过长时间的搜索,我试图关闭客户端连接,然后服务器运行,但客户端发出错误,因为套接字已关闭。这样做的正确方法是什么?为什么?

客户代码:

private class sendToServer extends AsyncTask<JSONObject, Void, String> {
    @Override
    protected String doInBackground(JSONObject... userData) {
        Socket clientSocket;
        try {
            clientSocket = new Socket("10.0.2.2", 7878);
            BufferedOutputStream  outToServer = new BufferedOutputStream(clientSocket.getOutputStream());
            outToServer.write( (userData[0].toString() + '\n').getBytes() );
            outToServer.flush();

            BufferedReader inFromServer = new BufferedReader(new Inpu    tStreamReader(clientSocket.getInputStream()));
            String reply = inFromServer.readLine();

            outToServer.close();
                Log.d("",reply);

            inFromServer.close();
            clientSocket.close();

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

服务器代码:

@Override
public void run() {
    try {
        BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        StringBuilder builder = new StringBuilder();
        String line;
        while ((line = inFromClient.readLine()) != null)
                builder.append(line);

        BufferedOutputStream outToClient = new BufferedOutputStream(connection.getOutputStream());
        outToClient.write( ("ACK" + '\n').getBytes() );
        outToClient.flush();

            inFromClient.close();           
            putToClient.close();

        parseIncomingData(builder.toString());

    } catch (Exception e) {
        System.out.println(e);
    } finally {
        try {
            connection.close();
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

看起来您的服务器将继续读取行,直到返回null。直到流被另一端关闭才会发生这种情况。作为测试,只需执行一个readLine(摆脱while循环)并查看是否所有内容都适用于单个消息。

或者你可以从客户端发送一个空字符串(或一些“特殊”终结符字符串)作为最后一个字符串 - 然后你可以在服务器上检查这个“特殊”字符串或空字符串以打破while readline循环。