2017-04-09 5 views
0

J'ai essayé d'envoyer des messages d'un serveur à mon application. J'utilise l'application "Simple Socket Tester" pour créer un serveur et envoyer des messages UTF-8 à l'application. Je n'ai jamais reçu les messages sur mon application et quand j'ai débogué l'application il est bloqué sur la ligne "mServerMessage = mBufferIn.readLine();" et ne passe jamais. Il semble donc qu'il n'est pas capable de lire le message. Quand je mets en pause le débogueur, je viens à "LocalSocketImpl.java" où il est bloqué sur "private natif FileDescriptor accept". Que puis-je faire pour éviter cela?Mon application est bloquée sur mBufferIn.readLine()

Mon TCP Client:

public TcpClient(OnMessageReceived listener) { 
    mMessageListener = listener; 

} 

/** 
* Sends the message entered by client to the server 
* 
* @param message text entered by client 
*/ 
public void sendMessage(String message) { 
    if (mBufferOut != null && !mBufferOut.checkError()) { 
     mBufferOut.println(message); 
     mBufferOut.flush(); 
    } 
} 


/** 
* Close the connection and release the members 
*/ 
public void stopClient() { 

    mRun = false; 

    if (mBufferOut != null) { 
     mBufferOut.flush(); 
     mBufferOut.close(); 
    } 

    mMessageListener = null; 
    mBufferIn = null; 
    mBufferOut = null; 
    mServerMessage = null; 
} 

public void run() { 

    mRun = true; 

    try { 
     //here you must put your computer's IP address. 
     InetAddress serverAddr = InetAddress.getByName(SERVER_IP); 

     Log.e("TCP Client", "C: Connecting..."); 

     //create a socket to make the connection with the server 
     Socket socket = new Socket(serverAddr, SERVER_PORT); 

     try { 

      //sends the message to the server 
      mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
      sendMessage("hi"); 

      //receives the message which the server sends back 
      mBufferIn = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8")); 



      //in this while the client listens for the messages sent by the server 
      while (mRun) { 

       mServerMessage = mBufferIn.readLine(); 
       System.out.println(mServerMessage); 

       if (mServerMessage != null && mMessageListener != null) { 
        //call the method messageReceived from MyActivity class 
        mMessageListener.messageReceived(mServerMessage); 
       } 

      } 

      Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + mServerMessage + "'"); 

     } catch (Exception e) { 

      Log.e("TCP", "S: Error", e); 

     } finally { 
      //the socket must be closed. It is not possible to reconnect to this socket 
      // after it is closed, which means a new socket instance has to be created. 
     } 

    } catch (Exception e) { 

     Log.e("TCP", "C: Error", e); 

    } 

} 

//Declare the interface. The method messageReceived(String message) will must be implemented in the MyActivity 
//class at on asynckTask doInBackground 
public interface OnMessageReceived { 
    public void messageReceived(String message); 
} 

}

+0

Que envoyez-vous du serveur au client? Le serveur est-il censé répondre au "salut" envoyé par le client? – bmdelacruz

+0

Non, le "salut" était juste pour voir si j'ai réussi à envoyer quelque chose au serveur. – Kspr

+0

Je l'ai réparé cependant, j'ai vu votre dernier commentaire, et c'était en fait le problème. J'ai ajouté un \ n et maintenant ça marche. Alors merci! – Kspr

Répondre

1

La chaîne que vous recevez doit avoir '\ n' à la fin. La méthode readLine arrêtera la lecture ou attendra le flux jusqu'à ce qu'il lise un '\ n'.

+0

Savez-vous s'il existe un moyen de lire des données qui ne se termine pas par une nouvelle ligne? Comme une autre commande que readLine()? – Kspr

+0

Je vous recommande n ° 8 sur ce [réponse] (http://stackoverflow.com/a/35446009/6396174). – bmdelacruz

+0

Merci pour votre aide, mais je réalise maintenant que je ne pense pas que cela fonctionnera. C'est parce que le serveur envoie un objet JSON que j'ai à analyser. Je suis désolé de vous déranger avec beaucoup de questions, mais vous ne savez pas comment faire cela? – Kspr