2010-11-22 36 views
1

J'utilise le code suivant (à partir de l'application Bluetooth exemple de chat) pour lire les données entrantes et construire une chaîne sur les octets lus. Je veux lire jusqu'à ce que cette chaîne est arrivée <!MSG>. Comment insérer cette condition avec la fonction read()?Problème: socket Java Lire flux d'entrée (Bluetooth) jusqu'à ce qu'une chaîne (<!MSG>) est lu

La chaîne entière ressemble à ce <MSG><N>xxx<!N><V>yyy<!V><!MSG>. Mais la fonction read() ne lit pas la chaîne entière à la fois. Lorsque j'affiche les caractères, je ne peux pas voir tous les caractères dans la même ligne. Il ressemble à:

Auteur: <MS

Auteur: G><N>xx

Auteur: x<V

.

.

.

J'afficher les caractères sur mon téléphone (HTC Desire) et j'envoyer les données à l'aide de Windows HyperTerminal.

Comment assurez-vous que tous les caractères sont affichés sur une seule ligne? J'ai essayé d'utiliser StringBuilder et StringBuffer au lieu de new String() mais le problème est read() La fonction ne lit pas tous les caractères envoyés. La longueur du flux d'entrée (octets) n'est pas égale à la longueur réelle de la chaîne envoyée. La construction de la chaîne à partir des octets lus se passe bien.

Merci pour toutes les suggestions et le temps passé à ce sujet. Aussi s'il vous plaît n'hésitez pas à suggérer d'autres erreurs ou une meilleure façon de faire en dessous des choses, le cas échéant.

Cheers,

Madhu

public void run() { 
     Log.i(TAG, "BEGIN mConnectedThread"); 
     //Writer writer = new StringWriter(); 
     byte[] buffer = new byte[1024];   
     int bytes; 
     //String end = "<!MSG>"; 
     //byte compare = new Byte(Byte.parseByte(end)); 

     // Keep listening to the InputStream while connected 
     while (true) { 
      try { 
       //boolean result = buffer.equals(compare); 
       //while(true) { 
        // Read from the InputStream 
        bytes = mmInStream.read(buffer); 
        //Reader reader = new BufferedReader(new InputStreamReader(mmInStream, "UTF-8")); 
        //int n; 
        //while ((bytes = reader.read(buffer)) != -1) { 
         //writer.write(buffer, 0, bytes); 

        //StringBuffer sb = new StringBuffer();      
        //sb = sb.append(buffer); 

        //String readMsg = writer.toString(); 
        String readMsg = new String(buffer, 0, bytes); 

        //if (readMsg.endsWith(end)) 
        // Send the obtained bytes to the UI Activity 
        mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, readMsg) 
          .sendToTarget();       
       //}      

      } catch (IOException e) { 
       Log.e(TAG, "disconnected", e); 
       connectionLost(); 
       break; 
      } 
     } 
    } 

Répondre

5

La fonction read ne fait aucune garantie sur le nombre d'octets, il retourne (il essaie généralement de revenir en tant que nombre d'octets du flux comme il peut, sans blocage). Par conséquent, vous devez mettre en mémoire tampon les résultats et les garder de côté jusqu'à ce que vous ayez votre message complet. Notez que vous pouvez recevoir quelque chose après que le message "<!MSG>", donc vous devez prendre soin de ne pas le jeter.

Vous pouvez essayer quelque chose le long de ces lignes:

byte[] buffer = new byte[1024]; 
int bytes; 
String end = "<!MSG>"; 
StringBuilder curMsg = new StringBuilder(); 

while (-1 != (bytes = mmInStream.read(buffer))) { 
    curMsg.append(new String(buffer, 0, bytes, Charset.forName("UTF-8"))); 
    int endIdx = curMsg.indexOf(end); 
    if (endIdx != -1) { 
     String fullMessage = curMsg.substring(0, endIdx + end.length()); 
     curMsg.delete(0, endIdx + end.length()); 
     // Now send fullMessage 
    } 
} 
+0

En fonction de la taille du message, il peut être raisonnable d'obtenir la taille 'de curMsg' avant d'ajouter et de commencer à chercher' end' a commencé à partir de cette position '- fin .length() - 1' (vérification> 0). – khachik

+0

Salut Flavio, Merci beaucoup pour l'aide. J'ai été capable de résoudre le problème avec vos suggestions et de lire le message complet sur une seule ligne, puis d'utiliser le message pour poursuivre l'analyse et d'autres actions dans mon projet. Merci une fois de plus. À votre santé –