Проблема: входной поток Java-Read socket (Bluetooth) до строки () читается - PullRequest
1 голос
/ 22 ноября 2010

Я использую следующий код (из примера приложения Bluetooth Chat), чтобы прочитать входящие данные и создать строку из прочитанных байтов.Я хочу читать, пока эта строка не прибыла <!MSG>.Как вставить это условие с помощью функции read ()?

Вся строка выглядит следующим образом <MSG><N>xxx<!N><V>yyy<!V><!MSG>.Но функция read () не читает всю строку сразу.Когда я отображаю символы, я не вижу все символы в одной строке.Это выглядит так:

Отправитель: <MS

Отправитель: G><N>xx

Отправитель: x<V

.

.

.

Я отображаю символы на своем телефоне (HTC Desire) и отправляю данные с помощью гипертерминала Windows.

Как убедиться, что все символы отображаются водна строка?Я попытался использовать StringBuilder и StringBuffer вместо новой String (), но проблема в том, что функция read () не читает все отправленные символы.Длина входного потока (в байтах) не равна фактической длине отправляемой строки.Построение строки из прочитанных байтов происходит хорошо.

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

Приветствия,

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

1 Ответ

5 голосов
/ 22 ноября 2010

Функция read не дает никаких гарантий относительно количества возвращаемых байтов (обычно она пытается вернуть столько байтов из потока, сколько может, без блокировки).Поэтому вы должны буферизовать результаты и хранить их в стороне, пока не получите полное сообщение.Обратите внимание, что вы можете получить что-то после сообщения "<!MSG>", поэтому вы должны позаботиться о том, чтобы не выбросить его.

Вы можете попробовать что-то вроде этого:

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