如何在 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
。
从另一边看,您的 CustomSerializerDeserializer
是 ByteArrayCrLfSerializer
的扩展,因为消息 CRLF not found before max message length:
正是来自那里。
因此,第一个:您应该为 CustomSerializerDeserializer
增加 maxMessageSize
,第二个 - 您必须在 write
的末尾提供 \r\n
个字节客户。或者只在那里使用 ByteArrayCrLfSerializer.serialize
。
我想使用 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
。
从另一边看,您的 CustomSerializerDeserializer
是 ByteArrayCrLfSerializer
的扩展,因为消息 CRLF not found before max message length:
正是来自那里。
因此,第一个:您应该为 CustomSerializerDeserializer
增加 maxMessageSize
,第二个 - 您必须在 write
的末尾提供 \r\n
个字节客户。或者只在那里使用 ByteArrayCrLfSerializer.serialize
。