Ich habe alles versucht, um das zu erreichen. Grundsätzlich habe ich eine Android-App, die Daten von einem Python-basierten Server über eine lokale Netzwerkverbindung empfängt. Ich kann Daten kein Problem erhalten. Wenn ich jedoch versuche, Daten zurückzusenden, stürzt die App ab und der Python-Server erhält leere Daten. Ich habe verschiedene Ansätze ausprobiert, aber nicht gearbeitet. Hier ist die Python Methode, die ich geschrieben habe, die Nachricht zu empfangen:Byte-Daten von Android App können nicht an Python-Server gesendet werden, wenn Sockets verwendet werden.
def checkReply(self):
reply = "no reply yet"
self.conn.settimeout(1)
try:
test = self.conn.recv(1024)
except:
self.conn.timeout;
print("I failed to hear this") #Debug to help see if I have heard an incomming message
try:
data = test.decode()
reply = data
except:
print("I failed to decode this") #Debug to help see if I could not decode an incomming message
print(reply)
self.conn.settimeout(0)
Mein Client auf meinem Android-Anwendung wie folgt aussieht:
public class Client extends AsyncTask<Void, Void, Void> {
String dstAddress;
int dstPort;
String response = "No data has been sent yet";
TextView textResponse;
Socket socket = null;
Client(String addr, int port, TextView textResponse) {
dstAddress = addr;
dstPort = port;
this.textResponse = textResponse;
}
@Override
protected Void doInBackground(Void... arg0) {
Socket socket = null;
try {
socket = new Socket(dstAddress, dstPort);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(
1024);
byte[] buffer = new byte[1024];
int bytesRead;
InputStream inputStream = socket.getInputStream();
/*
* notice: inputStream.read() will block if no data return
*/
while ((bytesRead = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, bytesRead);
response = byteArrayOutputStream.toString("Ascii");
}
byteArrayOutputStream.flush();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
response = "UnknownHostException: " + e.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
response = "IOException: " + e.toString();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
textResponse.setText(response);
super.onPostExecute(result);
}
protected String getSite(){
return response;
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public void returnMsg(){
try (DataOutputStream outToClient = new DataOutputStream(socket.getOutputStream())) {
byte[] buf = "hello".getBytes("UTF-8");
outToClient.writeBytes("Test");
outToClient.flush();
} catch (IOException e) {}
}
}
Ich habe auf einem physischen Test Gerät, also habe ich kein Protokoll, um die Fehlermeldung zu verfolgen. Jede Hilfe würde sehr geschätzt werden. Danke
Stack Trace/Fehlermeldung? –
Sorry, habe gerade den Beitrag dort bearbeitet. Ich teste auf einem physischen Gerät, so dass ich kein Protokoll zu verfolgen –
ADB bekommen Sie die Protokoll-Trace. http://adbshell.com/commands/adb-logcat –