Как я могу игнорировать сериализатор/десериализатор в весенней интеграции?

Я хочу отправить файл, используя tcp-модуль Spring Integration. Поэтому я сделал серверную часть, используя 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"/>

Но я сделал клиентскую часть с классом pojo в java следующим образом.

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 

Я думаю, что мне нужно игнорировать сериализатор/десериализатор для связи между двумя сторонами.


person verystrongjoe    schedule 17.02.2015    source источник


Ответы (1)


Поскольку вы не используете Spring Integration IP на стороне клиента, вам следует позаботиться о the end of message вручную.

Со стороны выглядит так, что ваш CustomSerializerDeserializer является расширением ByteArrayCrLfSerializer, потому что сообщение CRLF not found before max message length: как раз оттуда.

Итак, первое: вы должны увеличить maxMessageSize для CustomSerializerDeserializer и второе - вы должны предоставить \r\n байт в конце write на клиенте. Или просто используйте ByteArrayCrLfSerializer.serialize там.

person Artem Bilan    schedule 17.02.2015
comment
Спасибо за Ваш ответ. Это было здорово для меня. - person verystrongjoe; 23.02.2015