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