Java Socket OutputStream записывает один байт [] как два отдельных сообщения - PullRequest
0 голосов
/ 23 февраля 2019

Пытаясь отправить байт [] через TCP Socket в Java, он отправляет определенный массив в виде двух отдельных сообщений, в то время как другие массивы отправляют как одно сообщение.Более подробно, я преобразую шестнадцатеричную строку в байт [], используя следующую функцию:

public static byte[] hexStringToByteArray(String s) {
        byte[] b = new byte[s.length() / 2];
        for (int i = 0; i < b.length; i++) {
            int index = i * 2;
            int v = Integer.parseInt(s.substring(index, index + 2), 16);
            b[i] = (byte) v;
        }
        return b;
    }

, а затем отправляю ее через сокет Java TCP:

ServerSocket server = new ServerSocket(3030);
Socket socket = server.accept();
OutputStream out = socket.getOutputStream();
// sample hex string
String msg = "F0700F8000F42400001544952414E00000000000000000000000662000E00060000";
out.write(HexUtiles.hexStringToByteArray(msg));

При отладкекод, который я обнаружил, разделяет массив в байте с номером 1024. Кроме того, увеличение и уменьшение размера буфера сокета не имеет значения.

Кроме того, в сообщении нет 0A (шестнадцатеричная строка \n)!Я предполагаю, что есть некоторое странное поведение в методе write, который отправляет массив byte [] в виде двух сообщений!Как я могу отправить байт [] как одно сообщение?

1 Ответ

0 голосов
/ 23 февраля 2019

В TCP нет "сообщений".Все отправляется в виде потока, и неизвестно, как оно будет разделено на другой конец.Куски могут быть разделены или объединены.

Отправьте размер байта перед каждым массивом, используя DataOutputStream.Считайте размер на другом конце, используя DataInputStream, а затем столько байтов.Таким образом, вы сможете воссоздать свои массивы на другом конце.

Другой вариант - использовать ObjectOutputStream и ObjectInputStream и отправлять массивы как объекты.

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