没有Transformer的Spring TCP客户端

我按照这个例子在Spring中设置TCP客户端。 下面是tcpClientServerDemo-context.xml所在的tcpClientServerDemo-context.xml文件。 有人可以帮我拆除变压器并按原样发送数据而不做任何修改吗? 如果我尝试删除行reply-channel='clientBytes2StringChannel'或甚至将其reply-channel='clientBytes2StringChannel' null,我在构建项目时会遇到exception。

                  

编辑:

现在我可以使用自定义序列化器/解串器发送消息。 但不幸的是,我无法收到回复。 这是我的序列化器/反序列化器:

 public class CustomSerializerDeserializer implements Serializer, Deserializer { protected final Log logger = LogFactory.getLog(this.getClass()); public void serialize(String input, OutputStream outputStream) throws IOException { logger.info("inside serialize"); outputStream.write(buildSampleMsg(input)); outputStream.flush(); } public String deserialize(InputStream inputStream) throws IOException { logger.info("inside deserialize"); final int bufferSize = 1024; final char[] buffer = new char[bufferSize]; final StringBuilder out = new StringBuilder(); Reader in = new InputStreamReader(inputStream, "UTF-8"); for (;;) { int rsz = in.read(buffer, 0, buffer.length); if (rsz < 0) { break; } out.append(buffer, 0, rsz); } logger.info(out.toString()); return out.toString(); } public byte[] buildSampleMsg(String body){ logger.info("inside buildsamplemsg"); ...... return hexStringToByteArray(data); } 

我在序列化器/反序列化器的第一行上完成了一些日志记录,但是从不打印日志。 这反过来意味着,我们没有得到任何回应。 任何帮助将不胜感激。

删除回复频道是正确的。 您没有给出任何错误指示,但必须将网关接口方法返回类型更改为byte []。

编辑

很明显,如果大型机出现垃圾,你会做错事。 将“ABCD”转换为byte[] (使用getBytes() )后,应该进行EBCDIC转换; 如果你在字符串中有EBCDIC字符,那将无效。 另外,请记住默认的序列化程序会将CRLF(ascii)添加到输出中。 如果该主机可以确定数据本身的消息结束,则可以在serializer属性中使用ByteArrayRawSerializer 。 但是,您将需要一个自定义deserializer因为该框架将不知道如何从流构造消息; 除非主机在发送回复后关闭套接字,否则ByteArrayRawSerializer将作为deserializer属性。

用于与大型机(和其他)通信的常用技术是使用1,2或4字节长度的报头(网络字节顺序)。 ByteArrayLengthHeaderSerializer就是ByteArrayLengthHeaderSerializer

如果大型机需要EBCDIC分隔符,则需要一个自定义串行器/解串器 – 在那里进行EBCDIC转换可能更有意义,将它与应用程序逻辑分开。

您可以在此处阅读有关序列化器/反序列化器的信息 。

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

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