【问题标题】:Spring Integration - TCP Outbound Channel adds unwanted CRLF at the end of each lineSpring Integration - TCP Outbound Channel 在每行末尾添加不需要的 CRLF
【发布时间】:2017-07-05 08:00:01
【问题描述】:

我正在使用以下代码读取大文件,并通过 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,那么我将不会在输出中遇到单行拆分为两行的问题。我只想在文件所在的位置添加新行。

【问题讨论】:

  • 你为什么要读两遍?你以这种方式丢失数据。为什么在构建消息时忽略阅读计数?并且确实在发送消息时显然忽略了 bugffer ?这段代码根本不能说有效,更别说你怎么描述的了。
  • 我已经编辑了这个问题。更正了由于将代码从项目复制粘贴到示例代码而发生的错误。其次,忽略读取的字节是什么意思?请不要立即否决这个问题,我真正的问题的答案是 Spring TCP Channel 具有默认添加 CRLF 的行为,或者答案是 Spring 提供了一个配置,即不在每行末尾添加 CRLF。如果您愿意,请投反对票,但也请提供答案。
  • 忽略读取计数的错误依然存在。
  • 在构造消息时使用它来分隔消息,而不是使用整个缓冲区。这是非常基本的。不要问我如何使用自己的 API。
  • 你知道我的问题的答案吗?我知道定界的东西,但是对于我不想要的每次读取,这都会降低性能,并且这些不需要的字节在我的接收器端是可以忽略的。

标签: spring tcp spring-integration tcpchannel


【解决方案1】:

the documentation

TCP 是一种流协议;这意味着必须为通过 TCP 传输的数据提供某种结构,以便接收方可以将数据划分为离散的消息。连接工厂配置为使用(反)序列化程序在消息有效负载和通过 TCP 发送的位之间进行转换。这是通过分别为入站和出站消息提供反序列化器和序列化器来实现的。提供了许多标准(反)序列化程序。

ByteArrayCrlfSerializer 将字节数组转换为字节流,后跟回车符和换行符 (\r\n)。这是默认的(反)序列化程序,可以与 telnet 作为客户端一起使用。

...

您需要某种方式来了解消息何时完成 - 底层网络可能会将您的消息打包,以便以块的形式接收。

ByteArrayRawSerializer 不向消息中添加任何字符;它可能会满足您的需求。在读取端使用时,它使用套接字 EOF 来指示消息已完成。

【讨论】:

  • 谢谢加里。我很欣赏你提供的细节。我当然忘记了这个事实
猜你喜欢
  • 2017-04-28
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
相关资源
最近更新 更多