Данные не отображаются правильно при чтении из сокета TCP Java - PullRequest
0 голосов
/ 10 марта 2020

Я новичок в java сокетах и ​​процессах. Я пытаюсь прочитать информацию из сокета TCP, но когда я получил данные, некоторые данные отображались неправильно. (Я думаю, что это может быть проблема кодирования, процесс, из которого я читаю, является демоном Genivi DLT).

Вот пример моего кода:

try (Socket socket = new Socket(hostname, port)) {

            InputStream input = socket.getInputStream();
            InputStreamReader reader = new InputStreamReader(input);

            BufferedReader br1 = new BufferedReader(reader);         

            String line;


            while((line = br1.readLine())!=null) {
                String s = br1.readLine();
                byte[] utf8Bytes = s.getBytes("UTF-8");
                if(s.contains("SYS"))
                    System.out.println(s);
            }

Вот фотография того, как данные, которые должны отображаться .

А вот как это на самом деле отображается на консоли:

ÒWAVAè5ÓrQSYS ² (PathologyCollectorCPU.cpp: getLoad(...)@69): {"Name": "Core", "cpuName": "cpu0", "percent": 33, "totalUser": 1533306, "totalNice:" 0, "totalSys": 1216838, "totalIdle": 5681926}

Кто-нибудь есть идея, почему это может быть, или какие-то подходы, которые я должен использовать для решения своей проблемы?

Редактировать: После некоторых копаний я думаю, что нашел некоторую информацию о протоколе, здесь: https://www.autosar.org/fileadmin/user_upload/standards/foundation/1-0/AUTOSAR_PRS_DiagnosticLogAndTraceProtocol.pdf на странице 16 Если у вас есть еще советы, это будет с благодарностью.

1 Ответ

0 голосов
/ 11 марта 2020

Вы используете TCP (протокол управления передачей), и он передает данные по сети потоком. Таким образом, вам необходимо определить «длину данных» для каждого отправленного вами пакета.

Когда клиент / служба получает этот поток данных, он основывается на значении «длина данных» для считывания именно количества байтов. для пакета.

Вы можете проверить пример ниже для более подробной информации:

private void __updateRecvHeaderData(byte[] bytes) {
    if (bytes.length >= Constants.HEADER_BYTES) { // header length
        byte[] header = Arrays.copyOfRange(bytes, 0, Constants.HEADER_BYTES);
        __dataSize = MessagePacker.byteToShort(header); // network to host short
        __recvHeader = false;
        // package = |2 bytes header| <content bytes> |
        byte[] data = Arrays.copyOfRange(bytes, Constants.HEADER_BYTES, __dataSize + Constants.HEADER_BYTES);
        __onRecvData(data); // recursion
    }
}

Класс файла можно найти здесь: TCP получает и разделяет данные потока по данным -длина

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...