当前位置: 首页 > 面试题库 >

没有转换器的Spring TCP Client

孔安福
2023-03-14
问题内容

我遵循此示例在Spring中设置TCP客户端。下面是tcpClientServerDemo- context.xml变压器所在的我的文件。有人可以帮助我删除变压器并按原样发送数据吗?如果我尝试删除该行reply- channel='clientBytes2StringChannel'甚至将其设置为null,则在构建项目时会遇到异常。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:int="http://www.springframework.org/schema/integration"
       xmlns:int-ip="http://www.springframework.org/schema/integration/ip"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
        http://www.springframework.org/schema/integration/ip http://www.springframework.org/schema/integration/ip/spring-integration-ip.xsd">

    <context:property-placeholder />

    <!-- Client side -->

    <int:gateway id="gw"
                 service-interface="hello.SimpleGateway"
                 default-request-channel="input"/>

    <int-ip:tcp-connection-factory id="client"
                                   type="client"
                                   host="192.86.33.61"
                                   serializer="CustomSerializerDeserializer"
                                   deserializer="CustomSerializerDeserializer"
                                   port="${availableServerSocket}"
                                   single-use="true"
                                   so-timeout="10000"/>

    <bean id="CustomSerializerDeserializer" class="hello.CustomSerializerDeserializer" />

    <int:channel id="input" />

    <int-ip:tcp-outbound-gateway id="outGateway"
                                 request-channel="input"
                                 connection-factory="client"
                                 request-timeout="10000"
                                 reply-timeout="10000"/>

    <!-- Server side -->
    <!-- When creating the socket factory on the server side, we specify both the serializer and deserializer
    which deals with both accepting a stream formatted with the Stx-Etx bytes as well as sending a stream
    formatted with the Stx-Etx bytes. -->
    <int-ip:tcp-connection-factory id="serverConnectionFactory"
                                   type="server"
                                   port="${availableServerSocket}"
                                   single-use="true"
                                   so-linger="10000"
                                   serializer="Custom1SerializerDeserializer"
                                   deserializer="Custom1SerializerDeserializer"/>


    <bean id="Custom1SerializerDeserializer" class="hello.CustomSerializerDeserializer1" />

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

    <!-- We leave a message listener off of this channel on purpose because we hook
    one up before the test actually runs (see the unit test associated with this
    context file) -->
    <int:channel id="incomingServerChannel" />

</beans>

编辑:

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

public class CustomSerializerDeserializer implements Serializer<String>, Deserializer<String> {
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)添加到输出中。如果该大型机可以根据数据本身确定消息的结尾,则可以ByteArrayRawSerializerserializer属性中使用a
。但是,您将需要自定义,deserializer因为框架不会知道如何从流中构造消息。除非主机在发送答复后关闭套接字,否则a
ByteArrayRawSerializer将作为deserializer属性。


与大型机(和其他大型机)通信的常用技术是使用1、2或4字节长的标头(网络字节顺序)。在ByteArrayLengthHeaderSerializer做到了这一点。

如果大型机期望使用EBCDIC定界符,则需要一个自定义的序列化器/解串器-在那里进行EBCDIC转换,将其与应用程序逻辑分开可能更有意义。

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

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

ByteArrayCrlfSerializer,转换一个字节数组字节流随后回车和换行字符(\r\n)。这是默认的(反)序列化器,例如,可以与telnet一起使用。



 类似资料:
  • 我正在尝试使用Spring进行GET http请求。 我的主要班级: 使用CatMessage类: 我应该得到回来,因为我使用不工作的用户名和密码组合(和这个服务器部分工作正常),是: { } 我认为这应该行得通,因为我几乎是在复制Spring for Android的基本auth项目 但是发生的是解析的问题(我认为)。当然,我已经包含了Jackson和Spring依赖项,所以我不希望我的问题出现

  • 我用camel定义了一个处理器,它允许我使用计时器生成一个jaxb-javabean,并将pojo写入xml文件。但当我启动应用程序时,我遇到了以下错误: 08:09:00 WARN[or.ap.ca.co.ti.时间消费者](骆驼(骆驼-1)线程#2-定时器://生成发票)错误处理交换。交换[20E715FDB7EFE19-0000000000000000]。由:[java.io.IOEx 我的

  • 问题内容: 我编写的这段代码将转换为获取异常。 这是我的代码 问题答案: 是基元之上的 包装 类。可以将其强制转换为,但不能直接强制转换为。 如果使用代替,它将编译: 您也可以在中间添加演员表,如下所示:

  • 我首先有一个多部分文件,我想把它发送到camel管道,并用原始名称保存这个文件。 我的代码: 另一方面,我有: from(“seda:rest_upload”).convertBodyTo(File.class).to(“file://rest_files"); 我也尝试注册转换器: 当我执行我的代码时,我看到下面的stacktrace: 如何解决这个问题?

  • 我正在(gradle)spring boot项目中使用openAPI实现petstore API。我使用openapi生成器插件生成了一个服务器,并实现了一个简单的请求: 我生成的swagger-ui为请求提供了xml和json查询,但是xml似乎不起作用: 我甚至收到一条错误消息: 但是,我无法捕获此异常并打印整个上下文,它只发生在 我的确切错误消息已经有问题了:Springboot HttpM