Android已连接到Java服务器套接字,但服务器套接字未接收到数据

时间:2019-01-27 17:13:28

标签: java android sockets

Android应用正在连接到我的专用网络中的Java服务器套接字。之后,该应用程序将一个字符串写入PrintWriter,但是在服务器端什么也没收到。

我已经在同一台计算机上测试了代码,并且已连接(作为应用程序),并且它接收通过PrintWriter发送的字符串。

Android应用:

class SocketConnector extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... voids) {
        try {
            Socket socket = new Socket("192.168.2.116", Constant.HUB_PORT);

            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));


            JSONObject jsonObject = new JSONObject();
            jsonObject.put("command", "some_command");
            jsonObject.put("value", "some_value");

            out.println(jsonObject.toString());
            Log.v("json", jsonObject.toString());

            Log.v("Echo: ", in.readLine());

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (NetworkErrorException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }
}

Java服务器:

while (true) {

    //Open socket
    ServerSocket serverSocket = new ServerSocket(Constant.SOCKET_PORT);

    //wait for client connection
    Socket clientSocket = serverSocket.accept();

    //create input/output streams
    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

    System.out.println("Connected");

    String jsonString;

    while ((jsonString = in.readLine()) != null) {
        System.out.println(jsonString);
    }


    System.out.println(jsonString);

    //pass command and value to handleCommand method
    JSONObject jsonObject = new JSONObject(jsonString);
    JSONObject response = handleCommand(jsonObject.getString(Constant.JSON_COMMAND), jsonObject.getString(Constant.JSON_VALUE));

    out.println(response.toString());

    serverSocket.close();
    clientSocket.close();
}

}

我希望android应用正确发送数据,或者java服务器套接字正确接收发送的数据。

1 个答案:

答案 0 :(得分:0)

不能停止思考,因为它看起来很奇怪。不过,我有一个解释,所以我将在回答上做些刺探:

您有两个客户端连接到达服务器。连接1连接并且不发送任何东西(原因未知)。连接2连接并发送数据有效载荷。但是,服务器甚至从未尝试读取该有效负载,因为它一直忠实地等待连接1发送某些内容(它从未这样做)。第二个套接字甚至从未accept()-ed。

自然,当您使用调试器检查服务器时,会看到它在readLine()上等待。您的错误是假设readLine()与连接2相关联。

顺便说一下,这与.pcap息息相关;即使没有accept()版本的客户端连接,它仍然会收到ACK,并且可以自由地将更多数据发送到服务器。此类数据也将被确认。毕竟,服务器操作系统正在接收数据。您的服务器程序根本没有要求它。

有许多原因使之在进行localhost测试时可能起作用。很有可能与时间有关。