在同一个TCP套接字上复用许多独立的全双工流

时间:2011-08-26 15:27:28

标签: java sockets tcp

这可能是每个人在这里提出的最奇怪的问题。我会尽力解释它。

我需要用Java快速开发一个网络应用程序,集成一堆旧的网络应用程序(我已经有了它们的代码)并使一切工作在一起。每个旧的应用程序将成为新的应用程序的子功能;新的基本上是一个“包装”。

显然,这些应用程序中的每一个(由不同的人在不同时间开发)以不同的方式工作,使用不同的协议,消息的语法完全不同(即某些协议使用二进制消息,其他一些使用HTTP之类的消息,其他一些使用XML)和不同的消息顺序策略(流水线,停止和等待等)。

幸运的是,它们都是TCP。

包装器应用程序应该可以在不同的端口打开类似6-7个不同套接字的东西,这对我们的网络管理员来说并不好。他们只需要一个端口上的一个插槽。因此,所有协议都必须粉碎同一个管道。

是否有任何纯Java,开箱即用的解决方案,以透明和轻松的方式在同一个TCP套接字上复用和解复用许多独立的全双工流

或者是否有一个我忘记的简单解决方案?

编辑:子流是独立的,即一个子流等待来自另一个子流的子流没有死锁的可能性。

1 个答案:

答案 0 :(得分:2)

您无法通过TCP以透明方式执行此操作。

例如,考虑一下如果您的应用程序通过其中一个“通道”发送请求将会发生什么,这些“通道”依赖于它需要在另一个“通道”上获取的数据。如果网络状况下降了其中一个“通道”的足够数据包导致TCP连接停止(由于TCP窗口)等待响应,您实际上将停止同一TCP连接中的所有其他“通道”,因为它们共享同一个窗口,你可以陷入僵局

在同一窗口中的每个频道之前不会发生这种情况。

这可能会也可能不会影响您的具体应用 - 但可能会这样,因此这项技术并不透明。如果可能,您可以尝试使用SCTP来克服这个问题