我正在开发一个Android应用程序,它与Apache Tomcat服务器通信,用于发送和检索数据。其中一个servlet与在localhost上运行的python套接字服务器通信,这实际上是对数据库执行逻辑操作。在我的应用程序代码中,有两个与服务器通信的函数,第一个接收响应并解释它只返回“成功”或“失败”结果(dataExchange(String)
),第二个返回完整响应作为JSON array(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": "[email protected]",
"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服务器之前,我使用简单的Socket到Socket TCP通信,其中所有这些功能都运行得很好。
我解决了这个问题,但不是根本原因。在服务器端,我以字节的形式打印接收到的响应,并发现第一个函数是在实际数据之前发送一个不可解码的字节。因此,我没有将解码后的字符串传递给逻辑函数,而是使用了另一个函数,该函数从第一个“{”和“最后”}之间的字节字符串中选取数据。这样,Python根本不需要解码传入的消息,因此它不会产生错误。