как перенести записи в rms (j2me) на j2se через блютус - PullRequest
0 голосов
/ 05 марта 2011

СЕЙЧАС вот код для мобильного телефона 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, если так, пожалуйста, помогите мне .... пожалуйста, сделайте ваш ответ быстрее ...

1 Ответ

0 голосов
/ 05 марта 2011

То, как вы пишете и читаете здесь, только строки длиной до 255 символов, которые, кроме того, занимают одинаковое количество байтов в кодировке по умолчанию, записаны правильно.

На стороне письма:

  1. Оператор byte size=(byte) s.length(); преобразует длину строки в байте, таким образом, принимает только младшие 8 битов длины. Таким образом, только длины до 255 написаны правильно.
  2. Затем вы преобразуете String в байтовый массив с 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, используемой здесь).
  • Если нет:
    • принять решение о том, какой длины могут быть строки, и закодировать вашу длину с правильным количеством байтов. Для каждой строки Java достаточно 4 байта.
    • измерить длину после преобразования в байт [], а не до.
    • использовать цикл для чтения в массив, чтобы быть уверенным в захвате всей строки.
    • для getBytes() и new String(...), используйте варианты, которые принимают явное имя кодировки и дают им ту же кодировку (я рекомендую "UTF-8").
...