Java 无法在具有未定义终止符的通道上接收tcp(模式为服务器)消息

Java 无法在具有未定义终止符的通道上接收tcp(模式为服务器)消息,java,spring,sockets,tcp,spring-integration,Java,Spring,Sockets,Tcp,Spring Integration,目前,我们在应用程序中使用的是SpringIntegration2.1.0版本(由于传统应用程序无法切换到最新版本)。 申请流程如下: 所有配置详细信息都在配置文件中定义,如主机名、端口号、终止符等 通过通道使用TCP入站通道适配器从TCP获取消息 将其传递至分离器,以便进一步流动 这里的问题是,若消息的终止符不是,这是在配置文件中定义的,消息并并没有进入为拆分器定义的类,若终止符是相同的,那个么它工作正常。 要求是,若终止符值不同,则应使用tcp出站通道适配器在同一通道上显示错误消息(由于异步

目前,我们在应用程序中使用的是SpringIntegration2.1.0版本(由于传统应用程序无法切换到最新版本)。 申请流程如下:

  • 所有配置详细信息都在配置文件中定义,如主机名、端口号、终止符等
  • 通过通道使用TCP入站通道适配器从TCP获取消息
  • 将其传递至分离器,以便进一步流动
  • 这里的问题是,若消息的终止符不是,这是在配置文件中定义的,消息并并没有进入为拆分器定义的类,若终止符是相同的,那个么它工作正常。 要求是,若终止符值不同,则应使用tcp出站通道适配器在同一通道上显示错误消息(由于异步调用而使用入站和出站)。 我已经在跟踪级别启用了应用程序和spring日志记录,但无法理解消息被卡住的原因和位置

    配置文件的代码为

    <Config>
    <host>localhost</host>
    <port>8888</port>
    <mode>server</mode>
    <terminator>10</terminator>
    <msgLength>65535</msgLength>
    <inChannel>telnetInboundCustomChannel</inChannel>
    </Config>
    
    
    本地服务器
    8888
    服务器
    10
    65535
    telnetInboundCustomChannel
    
    用于连接详细信息的XML

    <beans:bean id="serverCustomSerializer"
    class="com.core.serializer.CustomSerializer">
    <beans:property name="terminatingChar" value="${server.terminator}"/>
    <beans:property name="maxLength" value="${server.msgLength}"/>
    </beans:bean>
    
    <beans:bean id="serverFactoryTaskExecutor"   
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <beans:property name="corePoolSize" value="5" />
    <beans:property name="queueCapacity" value="0" />
    
    </beans:bean
    <int:channel id="telnetLandingChannel" />
    <ip:tcp-connection-factory id="serverFactory" type="server"
    host="${server.host}" port="${server.port}" single-use="false"
    serializer="${server.serializer}" deserializer="${server.serializer}" task-
    executor="serverFactoryTaskExecutor"/>
    
    <ip:tcp-inbound-channel-adapter id="serverInboundAdpater"
    channel="telnetLandingChannel" connection-factory="serverFactory"
    error-channel="errorChannel" auto-startup="false"/>
    <ip:tcp-outbound-channel-adapter id="serverOutboundAdapter"
    channel="serverReplyChannel"
    connection-factory="serverFactory"
    auto-startup="true"/>
    
    
    
    现在还不清楚如何检测坏的终结者。根据定义,反序列化程序需要在返回消息之前知道消息已完成。您可以检测套接字关闭(bite<0)和n>0并返回一条特殊消息,但我不知道如何发出消息,除非您知道要查找哪些无效终止符

    编辑

    如果您的意思是检查另一个“特殊”(不可打印)字符,那么您可以使用类似

    if (n > 0 && (bite == bytes.byteValue())) {
        break;
    }
    else (if bite < 0x20) {
        return ("Bad terminator for" + new String(buffer, 0, n)).getBytes();
    }
    
    if(n>0&(bite==bytes.byteValue()){
    打破
    }
    否则(如果咬合<0x20){
    return(“+新字符串(缓冲区,0,n))的错误终止符)。getBytes();
    }
    
    不清楚如何检测坏的终止符。根据定义,反序列化程序需要在返回消息之前知道消息已完成。您可以检测套接字关闭(bite<0)和n>0并返回一条特殊消息,但我不知道如何发出消息,除非您知道要查找哪些无效终止符

    编辑

    如果您的意思是检查另一个“特殊”(不可打印)字符,那么您可以使用类似

    if (n > 0 && (bite == bytes.byteValue())) {
        break;
    }
    else (if bite < 0x20) {
        return ("Bad terminator for" + new String(buffer, 0, n)).getBytes();
    }
    
    if(n>0&(bite==bytes.byteValue()){
    打破
    }
    否则(如果咬合<0x20){
    return(“+新字符串(缓冲区,0,n))的错误终止符)。getBytes();
    }
    
    该要求完全没有意义。TCP中没有消息,任何协议中也没有未定义终止符的消息。

    该要求完全没有意义。TCP中没有消息,任何协议中也没有未定义终止符的消息。

    该要求完全没有意义。TCP中没有消息,任何协议中也没有未定义终止符的消息,这一要求完全没有意义。TCP中没有消息,任何协议中也没有未定义终止符的消息。当终止符值与配置文件中定义的值不匹配时,错误终止符/未定义终止符的定义为。例如,如果消息以任何其他字节(如9/11/12)结尾,则终止符的值为10(10)。。。splitter类无法侦听它。控件既不到CustomSerializer类。无法理解消息的去向。无法在应用程序中找到阻止消息的任何代码。spring是否要求任何终止符都知道消息已完成并且可以发送给其侦听器?但如果“坏终止符”是“z”,该怎么办?除非客户机和服务器同意某些已知条件,否则您怎么可能知道消息是完整的?如果您的意思是特殊字符<0x20,请参阅对我答案的编辑。@PrabhjotSokhi什么消息?TCP是字节流,不是消息传递协议。如果是基于终止符的协议,在找到正确的终止符之前,您不知道是否收到了消息。所有这些关于“带有未定义终止符的消息”的讨论完全没有意义。确切地说,底线是发送方和接收方必须就如何确定流中“消息”的组成达成一致。如果发送方不遵守该协议,在Spring集成术语中,反序列化程序将永远等待(或者,如果设置了超时,则直到套接字超时)。您可以在反序列化程序中捕获该超时并返回“部分”消息,但这将是一个非常脆弱的体系结构,因为网络故障可能导致虚假消息发射。您必须修复发送端。当终止符值与配置文件中定义的值不匹配时,错误终止符/未定义终止符的定义为。例如,如果消息以任何其他字节(如9/11/12)结尾,则终止符的值为10(10)。。。splitter类无法侦听它。控件既不到CustomSerializer类。无法理解消息的去向。无法在应用程序中找到阻止消息的任何代码。spring是否要求任何终止符都知道消息已完成并且可以发送给其侦听器?但如果“坏终止符”是“z”,该怎么办?除非客户机和服务器同意某些已知条件,否则您怎么可能知道消息是完整的?如果您的意思是特殊字符<0x20,请参阅对我答案的编辑。@PrabhjotSokhi什么消息?TCP是字节流,不是消息传递协议。如果是基于终止符的协议,在找到正确的终止符之前,您不知道是否收到了消息。所有这些关于“带有未定义终止符的消息”的讨论完全没有意义。确切地说,底线是发送方和接收方必须就如何确定流中“消息”的组成达成一致。如果发送方不遵守该协议,在Spring集成术语中,反序列化程序将永远等待(或