2011-03-05 86 views
0

現在,這裏以J2SE是J2ME手機的編碼發送字符串:如何轉移記錄均方根(J2ME)通過藍牙

String s="hai"; 
try{ 
    String url = "btspp://001F81000250:1;authenticate=false;encrypt=false;master=false"; 
    StreamConnection stream = null; 
    InputStream in; 
    OutputStream out; 
    stream = (StreamConnection) Connector.open(url); 
    out=stream.openOutputStream(); 
    String s=tf.getString(); 
    byte size=(byte) s.length(); 
    out.write(size); 
    out.write(s.getBytes()); 
    out.flush(); 
    out.close(); 
    stream.close(); 
} 
catch(Exception e){ 
} 

現在的編碼J2SE用於接收字符串:

StreamConnectionNotifier notifier=null; 
try{ 
    String url = "btspp://localhost:"+new UUID("1101", true).toString()+";name=PCServerCOMM;authenticate=false"; 
    System.out.println(LocalDevice.getLocalDevice().getBluetoothAddress()+"\nCreate server by uri: " + url); 
    notifier= (StreamConnectionNotifier) Connector.open(url); 
    while(true){ 
     System.out.println("waiting...."); 
     StreamConnection con = notifier.acceptAndOpen(); 
     System.out.println("Got connection.."); 
     InputStream is=con.openInputStream(); 
     //byte b[]=new byte[40]; 
     /* 
      while(is.available()>0){ 
      System.out.print((char)is.read()); 
      }*/ 
     //is.read(b, 0, 40); 
     int size=is.read(); 
     byte b[]=new byte[size]; 
     is.read(b, 0, size); 
     File f=new File("d://test.xml"); 
     FileOutputStream fo=new FileOutputStream(f); 
     fo.write(b,0,b.length); 
     fo.close(); 
     con.close(); 
     System.out.println(new String (b)); 
    } 
    //printing(f); 
}    catch(Exception e){ 
    JOptionPane.showConfirmDialog(new JFrame(), e.getMessage()); 
} 

我試過這個編碼的數據傳輸,但它不是一個成功的,因爲當我們發送的字符串太長,然後有接收方的問題。我該如何解決這個問題?

是否有任何其他方式在RMS將數據傳輸到J2SE,如果是的話請幫我....請您的答覆快...

回答

0

你現在的樣子寫入和讀出在這裏,只有串長度最多爲255個字符,在默認編碼中只佔用相同數量的字節,寫入正確。

在寫入側:

  1. 聲明byte size=(byte) s.length();轉換在一個字節中的字符串的長度,從而只在該長度的低8位。所以,只有長度高達255的是正確的。
  2. 然後,您將字符串轉換爲與s.getBytes()的字節數組 - 該數組可能比字符中的原始字符串更長(以字節爲單位)。此轉換使用您的發送設備的默認編碼。

在閱讀方面:

  1. 聲明int size=is.read();讀取寫入前,那麼你正在創建一個字節數組的長度。
  2. is.read(b, 0, size);將一些字節讀入此數組 - 它不一定會填充整個數組。
  3. 然後,您使用接收設備的默認編碼將您的字節數組(甚至可能不會完全填充)轉換爲字符串。

因此,我們有:

  1. 超過255個字符的所有字符串都是錯別字。
  2. 如果發送方和接收方使用不同的編碼,您可能會得到錯誤的輸出。
  3. 如果發送端使用像UTF-8這樣的編碼,其中某些字符佔用多個字節,則字符串在末尾被截斷(如果出現此類字符)。

如何解決這個問題:

  • 如果你可以使用雙方一個DataInputStream和DataOutputStream(我不知道什麼J2ME),使用他們那裏,與他們readUTFwriteUTF方法。他們解決了所有的問題(如果你的字符串在這裏使用的修改後的UTF-8編碼最多需要65535字節)。
  • 如果不是:
    • 決定字符串可以使用多長時間,並用正確的字節數對您的長度進行編碼。每個Java字符串4個字節就足夠了。
    • 測量轉換爲字節[]之後的長度,而不是之前。
    • 使用循環讀入數組,以確保捕獲整個字符串。
    • getBytes()new String(...),使用明確的編碼名稱,並給他們相同的編碼(我建議"UTF-8")的變種。