Функция отправляет не декодируемый текст Android / Java - PullRequest
0 голосов
/ 25 февраля 2019

Я занимаюсь разработкой приложения для Android, которое связывается с сервером Apache Tomcat для отправки и получения данных.Один из сервлетов связывается с сервером сокетов python, работающим на localhost, и фактически выполняет логические операции с базой данных.В коде моего приложения есть две функции, которые взаимодействуют с сервером, во-первых, который получает ответ и интерпретирует его как возвращающий только результаты «Успех» или «Сбой» (dataExchange(String)), а вторая, которая возвращает полный ответ какмассив JSON (dataExchangeWithReturn(String)) (все взаимодействие происходит с использованием JSON).Первая функция внутренне вызывает вторую функцию для получения ответа, а вторая функция вызывает третью функцию для связи с помощью Http post-запроса с сервером.Вторая функция при непосредственном вызове работает отлично.Однако первая функция, очевидно, отправляет данные мусора, что приводит к следующей ошибке на сервере Python API: 'utf-8' codec can't decode byte 0x9b in position 1: invalid start byte.Когда я печатаю строку, которая должна быть отправлена ​​через dataExchange(String) на Android Studio Logcat, она печатает обычную строку, идентичную той, которая отправляется с использованием dataExchangeWithReturn(String).Я не могу понять, почему данные, отправляемые с помощью первой функции, не читаются сервером, в то время как вторая функция прекрасно работает.

Пример ответа на запрос на стороне сервера для dataExchangeWithReturn(String):

Request recieved from: ('127.0.0.1', 48358)
Request : {"request":"e_u_m","contact_number":"9898871289"}
Parsed string : {'request': 'e_u_m', 'contact_number': '9898871289'}


--------------
Sending Response : 
[{"name": "Employee", "email": "employeee@email.com", 
"contact_number": "1111111111", "supervisor_id": "9898871289", 
"supervisor_name": "Shivang", "no_assigned_leads": "1", 
"address_street": "Addr", "address_area": "area", "address_city": ""}]

Пример ответа на стороне сервера для dataExchange(String):

Request recieved from: ('127.0.0.1', 48368)
'utf-8' codec can't decode byte 0x9b in position 1: invalid start byte


--------------
Sending Response : 
[{'resp': 'Wrong format'}]

Ниже приведен код для всех трех функций, упомянутых здесь:

public static int dataExchange(String data)
{
    int result = FAILURE;
    try
    {
        JSONArray receivedData = dataExchangeWithReturn(data);

        if(receivedData.length() == 0)
            Log.i("DataExchange","Server sent no data !");

        JSONObject dataObject = receivedData.getJSONObject(0);

        String response = dataObject.getString("response");

        if(response.equalsIgnoreCase("success"))
            result = SUCCESS;


    }
    catch (JSONException e)
    {
        Log.i("DataExchange","Server sent malformed data");
        e.printStackTrace();
    }

    return result;
}

public static JSONArray dataExchangeWithReturn(String data)
{
    JSONArray receivedData;
    String received;
    try
    {
        Log.i("SendingRequest", data);
        received = getResponse(data);

        receivedData = new JSONArray(received);
        Log.i("DataExchange", receivedData.toString());

        if(receivedData.length() == 0) {
            Log.i("ServerIssue", "Server did not sent data !");
        }

        return receivedData;


    }
    catch (JSONException e)
    {
        Log.i("DataExchangeReturn", e.getMessage());
        return new JSONArray();
    }
    catch (Exception e)
    {
        e.printStackTrace();
        return new JSONArray();
    }

}

public static String getResponse(String requestString)
{
    try
    {
        String data = "/api-sample/call";
        URL connectionUrl = new URL("http", MainActivity.SERVER_IP_ADDR, MainActivity.SERVER_PORT, data);
        HttpURLConnection conn = (HttpURLConnection) connectionUrl.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json");

        // Writing JSON data
        conn.setDoOutput(true);
        OutputStream osw = conn.getOutputStream();
        osw.write(requestString.getBytes(StandardCharsets.UTF_8));

        osw.close();

        // Reading response
        StringBuilder response = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String temp;
        while((temp = br.readLine()) != null)
        {
            response.append(temp);
        }

        br.close();

        // System.out.println(response.toString());
        return response.toString();
    }
    catch(Exception e)
    {
        e.printStackTrace();
        return new String();
    }
}

Также обратите внимание, что перед настройкойна сервере Apache Tomcat я использовал простую связь между сокетом и сокетом TCP, в которой все эти функции работали идеально.

1 Ответ

0 голосов
/ 27 февраля 2019

Я решил проблему, но не из первопричины.На стороне сервера я распечатал полученный ответ в виде байтов и решил, что первая функция отправляет недекодируемый байт перед фактическими данными.Поэтому вместо передачи декодированной строки в логическую функцию я использовал другую функцию, которая выбирает данные из строки байтов между первым '{' и последним '}'.Таким образом, Python вообще не нужно декодировать входящее сообщение, поэтому он не будет выдавать ошибки.

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