2010-11-22 9 views
1

Gelen verileri okumak ve okunan baytlardan bir dize oluşturmak için aşağıdaki kodu (Bluetooth Sohbet örnek uygulamasından) kullanıyorum. Bu dize <!MSG> ulaşana kadar okumak istiyorum. Read() işleviyle bu koşul nasıl eklenir?Sorun: Bir dize (<!MSG>) okunana kadar Java-Read yuvası (Bluetooth) giriş akışı

Bütün dize bu <MSG><N>xxx<!N><V>yyy<!V><!MSG> gibi görünüyor. Ancak read() işlevi bir kerede tüm dizeyi okumaz. Karakterleri görüntülediğimde, tüm karakterleri aynı satırda göremiyorum. Görünüşe gibi:

Gönderen: <MS

Gönderen: G><N>xx

Gönderen: x<V

.

.

.

Telefonumdaki karakterleri (HTC Desire) görüntüledim ve verileri hyperterminal pencerelerini kullanarak gönderiyorum.

Tüm karakterlerin tek bir satırda görüntülendiğinden nasıl emin olunur? Yeni String() yerine StringBuilder ve StringBuffer kullanmayı denedim ama sorun read() işlevi gönderilen tüm karakterleri okumaz. Giriş akışının uzunluğu (bayt) gönderilen dizenin gerçek uzunluğuna eşit değildir. Okunan bayttan dizinin oluşturulması iyi oluyor.

Bu konuyla ilgili herhangi bir öneri ve zaman için teşekkür ederiz. Ayrıca, eğer varsa, başka hatalar veya şeylerin altında daha iyi bir yol önermek için çekinmeyin.

alkış

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

cevap

5

read işlevi döner bayt sayısı ile ilgili herhangi bir garanti etmez (genellikle olmadan, olabildiğince akımından sayıda bayt döndürmeye çalışır) bloke eder. Bu nedenle, sonuçları tamponlamanız ve mesajınızın tamamını alana kadar bir kenara bırakmanız gerekir. "<!MSG>" mesajından sonra bir şey alabileceğine dikkat edin, böylece atmamak için dikkat etmelisiniz.

Bu satırlar boyunca bir şey deneyebilirsiniz: o eklemeden önce `curMsg` boyutunu almak ve arayan başlatmak için makul olabilir

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

mesaj boyutuna bağlı' Sonu ' 'o pozisyondan başladı - ucunu .length() - 1 '(kontrol etme> 0). – khachik

+0

Merhaba Flavio, Yardım için çok teşekkür ederim. Sorunu önerilerinizle çözebildim ve iletinin tamamını tek bir satırda okuyabiliyordum ve daha sonra projemde daha fazla ayrıştırma ve daha fazla eylem için iletiyi kullanabiliyordum. Tekrar teşekkürler. Şerefe –

İlgili konular