2017-10-11 7 views
1

Ceci est ma première application sur android et j'essaye d'écrire un client TCP. Jusqu'à présent, j'ai un serveur TCP python et je l'ai testé avec un client python TCP et ça marche très bien.Le programme se bloque lors de l'envoi du paquet TCP

J'ai pris l'exemple de client TCP de here. Lorsque je démarre l'application, je peux voir sur handshark la prise de contact afin que la connexion soit établie.

Maintenant, le problème est avec l'envoi de message. quand je mets la fonction appel

if (mTcpClient != null) 
{ 
    mTcpClient.sendMessage("testing"); 
} 

dans l'activité principale:

public void ChangeButtonState(View view) 
{ 
    boolean state = ((ToggleButton) view).isChecked(); 
    if (state) 
    { 

     if (mTcpClient != null) { 
      mTcpClient.sendMessage("testing"); 
     } 


     textView.setText("button is on. sent Tcp message. "); 
     textView.setVisibility(View.VISIBLE); 
    } else { 
     textView.setText("button is off"); 
    } 
} 

Le code tombe en panne sur la ligne mBufferOut.println(message); en classe TcpClient.

Mais si j'appelle cette fonction juste après la ligne mBufferOut = new PrintWriter(socket.getOutputStream()); dans la classe TcpClient, le client transmet le message, le serveur le reçoit et le renvoie au client.

Donc, ma question est pourquoi le code plante-t-il? le membre mTcpClient n'est pas nul.

+0

Exécutez-vous ce code à partir du thread principal? S'il vous plaît partager trace de la pile –

Répondre

0

Vous devez envoyer des demandes réseau dans un thread d'arrière-plan. Utilisez AsyncTask ou Thread.

new Thread(new Runnable(){ 
    public void run(){ 
     mTcpClient.sendMessage("test"); 
    } 
}).start(); 
+0

Merci! résolu le problème. pourquoi devrait-il être sur le fil de toute façon? – user1673206

+0

Content de pouvoir aider. Si vous envoyez des demandes de réseau dans le thread de premier plan, l'application se bloque jusqu'à ce que la demande soit terminée. Ainsi, le SDK Android a forcé les développeurs à effectuer des appels réseau dans un thread d'arrière-plan. –