如何在 spring 集成中忽略 serializer/deserializer?

How can I ignore serializer/deserializer in spring integration?

我想使用 spring 集成 tcp 模块发送文件。所以我使用 tcp-connection-factory 制作了服务器端。

<int-ip:tcp-connection-factory id="crLfServer" 
        type="server" 
        host="localhost"  
        port="7777"  
        single-use="true"
        so-timeout="10000"
        serializer="serializer"
        deserializer="serializer"
        />

<bean id="serializer" class="com.sds.redca.core.normalizer.CustomSerializerDeserializer" />

<int-ip:tcp-inbound-gateway id="gatewayCrLf"
    connection-factory="crLfServer"
    request-channel="toSA" 
    error-channel="errorChannel"/>

但是,我在 java 中使用 pojo class 创建了客户端,如下所示。

import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;

public class SendClient {
    public static void main(String[] args) {
        String serverIp = "localhost";
        Socket socket = null;

        try {
            // 서버 연결
            socket = new Socket(serverIp, 7777);
            System.out.println("서버에 연결되었습니다.");

            FileSender fs = new FileSender(socket);
            fs.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class FileSender extends Thread {
    Socket socket;
    DataOutputStream dos;
    FileInputStream fis;
    BufferedInputStream bis;

    public FileSender(Socket socket) {
        this.socket = socket;
        try {
            dos = new DataOutputStream(socket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            String fName = "d:/test2/test.jpg";
            dos.writeUTF(fName);

            File f = new File(fName);
            fis = new FileInputStream(f);
            bis = new BufferedInputStream(fis);

            int len;
            int size = 4096;
            byte[] data = new byte[size];
            while ((len = bis.read(data)) != -1) {
                dos.write(data, 0, len);
            }

            dos.flush();
            dos.close();
            bis.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

最后,我得到了如下错误。

CRLF not found before max message length: 2048 

我想我不得不忽略serializer/deserializer来进行双方的沟通。

由于您不在客户端使用 Spring 集成 IP,因此您应该手动处理 the end of message

从另一边看,您的 CustomSerializerDeserializerByteArrayCrLfSerializer 的扩展,因为消息 CRLF not found before max message length: 正是来自那里。

因此,第一个:您应该为 CustomSerializerDeserializer 增加 maxMessageSize,第二个 - 您必须在 write 的末尾提供 \r\n 个字节客户。或者只在那里使用 ByteArrayCrLfSerializer.serialize