这可能是这里每个人都被问到的最奇怪的问题。我会尽力解释。
我需要用 Java 快速开发一个网络应用程序,集成一堆旧的网络应用程序(我已经有了它们的代码)并使所有东西协同工作。每个旧应用程序都将成为新应用程序的子功能;新的基本上是一个“包装器”。
显然,这些应用程序中的每一个(由不同的人在不同的时间开发)以不同的方式工作,使用不同的协议(protocol),消息的语法完全不同(即一些协议(protocol)使用二进制消息,其他一些使用 HTTP,如消息,其他一些使用 XML)和不同的消息顺序策略(流水线、停止和等待等)。
还好都是TCP。
包装器应用程序应该可以在不同的端口打开 6-7 个不同的套接字,这对我们的网络管理员来说不是一件好事。他们只想要一个端口上的一个 socket 。所以所有的协议(protocol)都必须压在同一个管道上。
是否有任何纯 Java 开箱即用的解决方案,以透明且无障碍的方式在同一个 TCP 套接字上复用和解复用许多独立的全双工流?
或者是否有我忘记的更简单的解决方案?
编辑:子流是独立的,即不存在因一个子流等待来自另一个子流的某些内容而导致死锁的可能性。
最佳答案
你不能通过 TCP 以透明的方式做到这一点。
例如,考虑如果您的应用程序通过其中一个“ channel ”发送请求,该请求取决于它需要从另一个“ channel ”获取的数据,将会发生什么。如果网络条件丢弃了足够多的“ channel ”之一的数据包导致您的 TCP 连接停止(由于 TCP 窗口)等待响应,您实际上会停止同一 TCP 连接中的所有其他“ channel ”,因为它们共享同一个窗口,你可能会陷入僵局
如果每个 channel 都在同一个窗口中,这在以前是不会发生的。
这可能会也可能不会影响您的特定应用程序 - 但它可能会,因此该技术并不透明。如果可能的话,您可以尝试使用 SCTP 来克服这个问题
关于java - 在同一个 TCP 套接字上复用许多独立的全双工流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7207069/