2014-04-07 2 views
6

Dies ist meine erste Frage. Ich habe nach Lösungen für ähnliche Probleme gesucht, aber in jedem Fall gab es einige Unterschiede zu meinem Fall. Ich versuche, eine einfache Verbindung zwischen einem Python-Server und einer Android-Anwendung mit Sockets herzustellen. Die Android-App startet eine Konversation mit dem Server: Sie sendet eine Nachricht an den Server, der Server empfängt und zeigt sie an, dann sendet der Server eine Antwort an die App. Die App zeigt die Antwort auf dem Bildschirm in einer Textansicht an. Dies ist mein Code auf der Client-Seite:Verbindung zwischen Python-Server und Android-Anwendung

public class MyClient extends Activity implements OnClickListener{ 
EditText enterMessage; 
Button sendbutton; 

@Override 
protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.myclient); 
    enterMessage = (EditText)findViewById(R.id.enterMessage); 
    sendbutton = (Button)findViewById(R.id.sendbutton); 
    sendbutton.setOnClickListener(this); 
} 

@Override 
public void onClick(View arg0) { 
    Thread t = new Thread(){ 

     @Override 
     public void run() { 
      try { 
       Socket s = new Socket("192.168.183.1", 7000); 
       DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 
       dos.writeUTF(enterMessage.getText().toString()); 

       //read input stream 
       DataInputStream dis2 = new DataInputStream(s.getInputStream()); 
       InputStreamReader disR2 = new InputStreamReader(dis2); 
       BufferedReader br = new BufferedReader(disR2);//create a BufferReader object for input 

       //print the input to the application screen 
       final TextView receivedMsg = (TextView) findViewById(R.id.textView2); 
       receivedMsg.setText(br.toString()); 

       dis2.close(); 
       s.close(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    t.start(); 
    Toast.makeText(this, "The message has been sent", Toast.LENGTH_SHORT).show(); 
} } 

Und auf der Serverseite dieser ist mein Code:

from socket import * 

HOST = "192.168.183.1" #local host 
PORT = 7000 #open port 7000 for connection 
s = socket(AF_INET, SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) #how many connections can it receive at one time 
conn, addr = s.accept() #accept the connection 
print "Connected by: " , addr #print the address of the person connected 
while True: 
    data = conn.recv(1024) #how many bytes of data will the server receive 
    print "Received: ", repr(data) 
    reply = raw_input("Reply: ") #server's reply to the client 
    conn.sendall(reply) 
conn.close() 

Wenn ich versuche, eine Nachricht von der App mit dem Server funktioniert es perfekt zu schicken . Sobald der Server die Nachricht empfängt und anzeigt, wird die App sofort mit der folgenden Fehlermeldung beendet: unerwartet beendet. Bitte versuche es erneut. Zusätzliche Informationen: Ich benutze ADT-Bundle für Android-Entwicklung und IDLE, um den Server-Code auszuführen. Beide unter Windows8.

Antwort

2

Von dem, was ich verstehe Sie einen Thread verwenden, um den Server zu nennen, aber im selben Thread versuchen Sie die Ergebnisse auf der Benutzeroberfläche zu posten.

final Textansicht receivedMsg = (TextView) findViewById (R.id.textView2); receivedMsg.setText (br.toString());

Wenn Sie Ihren eigenen Java-Thread verwenden, müssen Sie die folgenden Anforderungen in Ihrem eigenen Code behandeln: Synchronisation mit dem Hauptthread, wenn Sie Ergebnisse auf der Benutzeroberfläche zurückgeben. Ich sehe nicht, dass Sie das tun. Sie müssen entweder einen Handler verwenden oder vielleicht sollten Sie die Asynctask von Android in Betracht ziehen. Mit dem AsyncTAsk können Sie in die Benutzeroberfläche schreiben, nachdem diese Methode ausgelöst wurde. onPostExecute (Ergebnis) Wird auf dem UI-Thread aufgerufen, nachdem die Hintergrundberechnung abgeschlossen ist.

So innerhalb dieser Methode können Sie in der Benutzeroberfläche schreiben. Werfen Sie einen Blick auf diese Links http://learningdot.diandian.com/post/2014-01-02/40060635109 Asynctask vs Thread in android

0

Sie schreiben in ein GUI-Objekt in einem Nicht-GUI-Thread. Sie müssen einen Handler verwenden, um die Nachricht an den GUI-Thread zurückzugeben.

Schauen Sie sich hier für ein ziemlich einfaches Beispiel: Update UI through Handler

Verwandte Themen