有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Spring集成TCP刷新控制

我使用的是spring集成,ServerSocketFactory设置为具有良好的接收和写入缓冲区,TCPNoDelay设置为false。通过调试器在socket上验证设置是否正确

在spring integration serializer中写入outputstream时,我看到每个写入调用都被单独发送,带有一个TCP PSH(push)标志,即刷新

为什么会出现这种潮红?我怎样才能避免这种情况


共 (1) 个答案

  1. # 1 楼答案

    您需要定制序列化程序——它们通常在写入所有部分后刷新(例如,长度标题+有效载荷;有效载荷+CRLF;STX+有效载荷+ETX;等等)

    只需对您选择的序列化程序进行子类化,并覆盖serialize()方法以删除flush()。将其注入连接工厂

    编辑:

    哦,我明白了——Nagle的算法只适用于后续写入(请注意,有效负载和ETX在单个数据包中)。我们需要将流包装在缓冲输出流中。请打开一个JIRA issue

    同时,你可以用这样的方法来解决这个问题

    /**
     * Writes the byte[] to the stream, prefixed by an ASCII STX character and
     * terminated with an ASCII ETX character.
     */
    @Override
    public void serialize(byte[] bytes, OutputStream outputStream) throws IOException {
        BufferedOutputStream bos = new BufferedOutputStream(outputStream);
        bos.write(STX);
        bos.write(bytes);
        bos.write(ETX);
        bos.flush();
    }