2014-04-07 11 views
6

To jest moje pierwsze pytanie. Szukałem rozwiązań podobnych problemów, ale w każdym przypadku były pewne różnice w porównaniu do mojej sprawy. Próbuję ustanowić proste połączenie między serwerem Python a aplikacją Android przy użyciu gniazd. Aplikacja na Androida rozpoczyna rozmowę z serwerem: wysyła wiadomość na serwer, serwer odbiera i wyświetla ją, a następnie serwer wysyła odpowiedź do aplikacji. Aplikacja wyświetla odpowiedź na ekranie w widoku tekstowym. To jest mój kod po stronie klienta:Połączenie między serwerem Python a aplikacją Android

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(); 
} } 

A po stronie serwera to jest mój kod:

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() 

Gdy próbuję wysłać wiadomość z aplikacji na serwerze działa idealnie . Jednak, gdy tylko serwer odbierze wiadomość i wyświetli ją, aplikacja natychmiast zatrzymuje się z komunikatem o błędzie: niespodziewanie się zatrzymała. Proszę spróbuj ponownie. Dodatkowe informacje: używam pakietu ADT do programowania aplikacji na Androida i IDLE do uruchamiania kodu serwera. Zarówno na Windows8.

Odpowiedz

2

Z tego co rozumiem używasz nici w celu wywołania serwera, ale w tym samym wątku próbujesz pisać z powrotem wyniki do interfejsu użytkownika.

końcowy TextView receivedMsg = (TextView) findViewById (R.id.textView2); receivedMsg.setText (br.toString());

Jeśli używasz własnego wątku Java, musisz spełnić następujące wymagania w swoim własnym kodzie: Synchronizacja z głównym wątkiem po przesłaniu wyników do interfejsu użytkownika. Nie widzę, że to robisz. Musisz użyć Handler'a, a może powinieneś rozważyć użycie Asynctask Androida. Za pomocą AsyncTAsk można pisać w interfejsie po uruchomieniu tej metody. onPostExecute (Wynik) Wywołuje się w wątku interfejsu użytkownika po zakończeniu obliczeń w tle.

Wewnątrz tej metody można pisać w interfejsie użytkownika. spójrz na te linki: http://learningdot.diandian.com/post/2014-01-02/40060635109 Asynctask vs Thread in android

0

Piszecie do obiektu GUI w wątku non gui. Aby przekazać wiadomość z powrotem do wątku GUI, musisz użyć programu obsługi.

Spójrz tutaj dość prosty przykład: Update UI through Handler

Powiązane problemy