как перенести записи из rms(j2me) в j2se через bluetooth

ТЕПЕРЬ вот код для мобильного 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, если да, пожалуйста, помогите мне.... пожалуйста, ответьте быстро...


person user496789    schedule 05.03.2011    source источник


Ответы (1)


При том, как вы пишете и читаете здесь, правильно записываются только строки длиной до 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), используйте их там с их методами readUTF и writeUTF. Они решают все ваши проблемы (если ваши строки занимают не более 65535 байт в используемой здесь модифицированной кодировке UTF-8).
  • If not:
    • make a decision on how long the strings can be, and encode your length with the right number of bytes. 4 bytes are enough for every Java String.
    • измеряйте длину после преобразования в byte[], а не до.
    • используйте цикл для чтения в массив, чтобы обязательно захватить всю строку.
    • для getBytes() и new String(...) используйте варианты, которые принимают явное имя кодировки и дают им ту же кодировку (я рекомендую "UTF-8").
person Paŭlo Ebermann    schedule 05.03.2011