0

次に、文字列を送信するためのj2memobileのコーディングを示します。

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に転送する他の方法はありますか?もしそうなら、私を助けてください....あなたの返事を早くしてください...

4

1 に答える 1

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 のような一部の文字が 1 バイトを超えるエンコードを使用している場合、文字列は末尾で切り取られます (そのような文字が発生した場合)。

これを解決する方法:

  • 両側で DataInputStream と DataOutputStream を使用できる場合 (私は J2ME について何も知りません)、それらreadUTFwriteUTFメソッドを使用してください。それらはすべての問題を解決します (ここで使用される変更された UTF-8 エンコーディングで文字列が最大 65535 バイトかかる場合)。
  • そうでない場合:
    • 文字列の長さを決定し、正しいバイト数で長さをエンコードします。すべての Java 文字列には 4 バイトで十分です。
    • 前ではなく、byte[] に変換した後に長さを測定します。
    • 配列への読み取りにループを使用して、文字列全体を確実にキャプチャします。
    • と にはgetBytes()new String(...)明示的なエンコーディング名を取り、それらに同じエンコーディングを与えるバリアントを使用します (私は をお勧めし"UTF-8"ます)。
于 2011-03-05T17:11:40.450 に答える