Android подключается к сокету Java-сервера, но сокет-сервер не получает данные - PullRequest
0 голосов
/ 27 января 2019

Приложение 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 голосов
/ 28 января 2019

Не могу перестать думать об этом, потому что это кажется таким странным.Однако у меня есть объяснение, поэтому я попытаюсь ответить:

У вас есть два клиентских соединения, достигающих сервера.Соединение 1 подключается и ничего не отправляет (причина неизвестна).Соединение 2 подключается и отправляет данные полезной нагрузки.Однако сервер даже не пытается прочитать эту полезную нагрузку, потому что он покорно ждет, пока соединение 1 не отправит что-то (чего он никогда не делает).Второй сокет никогда даже не является accept() -ed.

Естественно, когда вы проверяете сервер с помощью отладчика, вы видите, что он ждет на readLine().Ваша ошибка заключалась в том, что readLine() было связано с соединением 2.

Кстати, этот джайв с .pcap;даже если клиентское соединение не accept(), оно все равно получает ACK и может бесплатно отправлять дополнительные данные на сервер.Такие данные также будут ACK'd.Ведь ОС сервера находится в получении данных;ваша серверная программа просто еще не просила об этом.

Существует множество причин, по которым это может сработать, когда вы выполняете тест localhost;скорее всего, это связано со временем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...