Spring Integration - Исходящий канал TCP добавляет нежелательный CRLF в конце каждой строки

Я читаю большие файлы, используя следующий код, и отправляю содержимое файла через буфер подключения TCP по буферу. В конце каждой отправки канал TCP добавляет символ CRLF. Я не хочу, чтобы это появлялось в результатах, если я не добавлю его.

        final int BUFFER_SIZE = 65536;
    long bytesToSkip = 0;
    byte[] buffer = new byte[BUFFER_SIZE];

    try (RandomAccessFile rand = new RandomAccessFile(new File(requestModel.getFilePath()), "r");
    ) {

        rand.seek(bytesToSkip);
        while ((read = rand.read(buffer)) != -1) {

            MessageBuilder mb = MessageBuilder.withPayload(buffer).setHeaderIfAbsent(IpHeaders.CONNECTION_ID, connectionId);
            outMsgChannel.send(mb.build())

            buffer = new byte[BUFFER_SIZE];
        }
    }
    catch(Exceptions .............. 

Пример вывода, где добавлена ​​новая строка. (Оба буфера огромны. Я упомянул только строки, вызывающие проблемы в конце каждого буфера)

Буфер Один содержал

Быстрая коричневая лиса перепрыгивает через ленивую собаку

Быстрая коричневая лиса перепрыгивает через ленивую собаку

Быстрая коричневая лиса перепрыгивает через

Буфер Два Содержит

Лентяй

Если не будет нежелательных CRLF, я не буду сталкиваться с проблемой разделения одной строки на две в выходных данных. Я хочу иметь новые строки только там, где есть файл.

1 ответ

Решение

Смотрите документацию.

TCP - это потоковый протокол; это означает, что некоторая структура должна быть предоставлена ​​для данных, транспортируемых по TCP, чтобы получатель мог разграничить данные в дискретные сообщения. Фабрики соединений настроены на использование (де) сериализаторов для преобразования между полезной нагрузкой сообщения и битами, отправляемыми по TCP. Это достигается путем предоставления десериализатора и сериализатора для входящих и исходящих сообщений соответственно. Предоставляется ряд стандартных (де) сериализаторов.

ByteArrayCrlfSerializer, преобразует массив байтов в поток байтов, за которым следуют символы возврата каретки и перевода строки (\r\n). Это сериализатор по умолчанию (de) и может использоваться, например, с telnet в качестве клиента.

...

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

ByteArrayRawSerializer не добавляет символы в сообщение; это может удовлетворить ваши потребности. При использовании на стороне чтения он использует сокет EOF, чтобы указать, что сообщение завершено.

Другие вопросы по тегам