gpt4 book ai didi

java - 函数发送不可解码的文本 Android/Java

转载 作者:行者123 更新时间:2023-11-28 23:12:58 26 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序,它与 Apache Tomcat 服务器通信以发送和检索数据。其中一个 servlet 与运行在本地主机上的 python 套接字服务器通信,这实际上对数据库执行逻辑操作。在我的应用程序代码中,有两个函数与服务器通信,首先,接收响应并将其解释为仅返回“成功”或“失败”结果 (dataExchange(String)),然后第二个以 JSON 数组形式返回完整响应 (dataExchangeWithReturn(String))(所有通信均使用 JSON)。第一个函数在内部调用第二个函数来获取响应,第二个函数调用第三个函数使用 Http post 请求与服务器进行通信。第二个函数,当直接调用时,工作完美。然而,第一个函数显然发送垃圾数​​据,导致 Python API 服务器出现以下错误:'utf-8' codec can't decode byte 0x9b in position 1: invalid start byte。当我在 Android Studio Logcat 上打印要通过 dataExchange(String) 发送的字符串时,它会打印一个常规字符串,与使用 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 通信,其中所有这些功能都运行良好。

最佳答案

我解决了问题,但没有从根本上解决问题。在服务器端,我以字节的形式打印接收到的响应,并认为第一个函数在实际数据之前发送了一个不可解码的字节。因此,我没有将解码后的字符串传递给逻辑函数,而是使用了另一个函数,该函数从第一个“{”和最后一个“}”之间的字节字符串中选取数据。这样,Python 根本不需要解码传入的消息,因此不会产生错误。

关于java - 函数发送不可解码的文本 Android/Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54871156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com