Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在同一TCP套接字上多路复用多个独立的全双工流_Java_Sockets_Tcp - Fatal编程技术网

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

Java 在同一TCP套接字上多路复用多个独立的全双工流,java,sockets,tcp,Java,Sockets,Tcp,这可能是这里每个人都会问的最奇怪的问题。我会尽力解释的 我需要用Java快速开发一个网络应用程序,集成一堆旧的网络应用程序(我已经有了它们的代码),并使所有东西都能协同工作。每个旧应用程序都将成为新应用程序的子功能;新的基本上是一个“包装器” 显然,这些应用程序中的每一个(在不同的时间由不同的人开发)都以不同的方式工作,使用不同的协议,使用完全不同的消息语法(即,一些协议使用二进制消息,一些协议使用类似HTTP的消息,一些协议使用XML)和不同的消息顺序策略(流水线、停止和等待等…) 幸运的是,

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

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

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

幸运的是,它们都是TCP

包装器应用程序应该能够在不同的端口打开6-7个不同的套接字,这对我们的网络管理员来说是不好的。他们只需要在一个端口上打开一个套接字。因此所有协议都必须挤在同一个管道上

是否有任何纯Java的现成解决方案可以在同一个TCP套接字上以透明且无麻烦的方式多路复用和解多路复用许多独立的全双工流

还是有一个更简单的解决方案我忘记了


编辑:子流是独立的,也就是说,一个子流等待来自另一个子流的内容不会导致死锁。

您不能通过TCP以透明的方式执行此操作

例如,考虑如果应用程序通过一个“通道”发送请求(取决于它在另一个“通道”上获取数据所需的数据),会发生什么情况。如果网络条件丢失了其中一个“通道”的足够数据包,从而导致TCP连接暂停(由于TCP窗口)等待响应实际上是在暂停同一TCP连接中的所有其他“通道”,因为它们共享同一个窗口,您可能会陷入死锁

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


这可能会影响您的特定应用程序,也可能不会影响您的特定应用程序,但可能会影响,因此这种技术是不透明的。您可以尝试使用SCTP来克服这一问题,如果可能的话

幸运的是,通道是独立的。对于“透明性”,我指的是带有getInputSream(int channelNo)和getOutputStream(int channelNo)的多路复用套接字方法,都在后台管理(使用一些FIFO技术和复杂的消息预报头,以便识别子流).但我在做梦:D我会深入研究SCTPgd1,你不能实现这个类吗?我是说MultiplexedSocket和那些方法,我想没有那么难…当然,但我不想重新发明轮子,如果轮子存在的话:)。这并不难,是的,但它需要适当的测试,我几乎没有时间。不过谢谢:)嗯。。。那是什么?多个端口或多个连接(或两者兼有)的主要问题是什么?