如何在不使用终止符或固定长度消息的情况下接收TCP数据包

如何在不使用终止符或固定长度消息的情况下接收TCP数据包,tcp,spring-integration,Tcp,Spring Integration,我正在使用SpringIntegration2.0.3和TCP。应用程序行为是,它充当TCP客户端,并使用TCP向第三方工具发送消息。因此,应用程序使用TCP连接到第三方工具,发送消息,等待回复,当收到回复时(再次充当客户端),将关闭连接。现在的问题是,第三方工具既不能添加任何终止符,也不能生成固定长度的消息 据我所知,有三种方法可以制作数据包并将其发送到应用程序 1) 始终发送固定大小的邮件 2) 发送每封邮件的邮件大小 3) 使用标记系统来分隔消息 但是我不能使用上面提到的任何方法,我想知道

我正在使用SpringIntegration2.0.3和TCP。应用程序行为是,它充当TCP客户端,并使用TCP向第三方工具发送消息。因此,应用程序使用TCP连接到第三方工具,发送消息,等待回复,当收到回复时(再次充当客户端),将关闭连接。现在的问题是,第三方工具既不能添加任何终止符,也不能生成固定长度的消息

据我所知,有三种方法可以制作数据包并将其发送到应用程序 1) 始终发送固定大小的邮件 2) 发送每封邮件的邮件大小 3) 使用标记系统来分隔消息

但是我不能使用上面提到的任何方法,我想知道在这种情况下我的应用程序如何接收响应消息,有可能吗?

您的程序应该在收到消息后关闭连接吗?或者,另一个程序应该在向您发送消息后关闭连接吗

如果是后者,那么就没有问题,因为您只需阅读,直到连接关闭


如果是前者,并且您无法更改应用程序协议,并且它还没有指定这些内容(是否有任何规范?),则等待超时。如果在X秒内还没有收到任何信息,请考虑接收到的完整信息并关闭连接。除非您将这些内容添加到应用程序协议中,否则它没有消息边界、开始或结束。请参阅
ByteArrayRawSerializer
及其
treatTimeoutAsEndOfMessage
。使用超时来划分消息是相当危险的,除非它相对较长(由于客户正在等待回复,所以不太友好);网络故障可能会导致接收到不完整的消息。此类活动不是TCP的正确使用。必须有某种方式使服务器知道消息是完整的;如果是这样,则可以提供自定义的
反序列化程序
,以便在从流中读取字节时检查它们。应用程序应该在连接完成后关闭连接接收到响应消息,或超时。由于我使用tcp出站网关和single use=“true”,但根据注释,此类用于适配器而不是网关。注释为“socket必须关闭以指示消息结束,此(反)序列化程序*只能由单向(非协作)使用”通道适配器,*不通过网关。“因为通道仅用于一条消息(single use=“true”)接收到的时刻响应将被关闭。是否有一种方法可以逐字节读取整个消息,并在其中结束,认为作为消息的结尾,因为超时不是一个好的选择,因此会有超时逼近的性能命中。@加里,请您提出这个问题的最佳解决方案,这将是GRAA。t如果有相同的例子。