2017-02-20 10 views
0

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

+1

Stack Trace/Fehlermeldung? –

+0

Sorry, habe gerade den Beitrag dort bearbeitet. Ich teste auf einem physischen Gerät, so dass ich kein Protokoll zu verfolgen –

+0

ADB bekommen Sie die Protokoll-Trace. http://adbshell.com/commands/adb-logcat –

Antwort

0

Ich schaffte es, das Problem zu lösen. Ich musste den Puffer spülen, bevor ich versuchte, irgendwelche Daten über den Sockel zurückzusenden

Verwandte Themen