Java 可以并行运行同一个套接字的多个实例吗?

Posted

技术标签:

【中文标题】Java 可以并行运行同一个套接字的多个实例吗?【英文标题】:Can Java run multiple instances of the same socket in parallel? 【发布时间】:2022-01-21 06:09:21 【问题描述】:

我正在通过带有 Future Boolean 的 Callable 循环多个套接字连接,以并行打开多个 IP 的套接字。如果每个 IP 不同,它似乎工作正常。但是,当需要向同一个 IP 发送数据时,一个套接字会多次打开到同一个 IP,这会导致 Spring 崩溃,但会在几秒钟后立即重启。

Java (Spring) 能否使用同一个套接字在同一个 IP 上运行多个实例?数据发送正常,任何一方都没有错误,除了主 Spring 线程在连接期间崩溃并重新启动(但这不会像我提到的那样影响连接)。

【问题讨论】:

【参考方案1】:

一个套接字拥有一个 TCP 连接。

一个TCP连接由标识。给定一些通过线路到达的字节,这组 4 个数字是 TCP 实现决定字节属于哪个“对话”的方式。没有其他办法。

结果是,如果您希望您的客户端程序有多个 TCP 连接到同一个目标,您需要有多个套接字,并且您需要不同的源端口(通常是这种情况,只是不在创建套接字时指定源端口)。

这是基本的 TCP 和套接字的东西,不是 Java 特定的。

【讨论】:

我已经物理端口转发,并在服务器机器中打开了相关的单端口。如果我在创建套接字时没有在客户端中指定源端口,我认为连接将在服务器端被阻止,因为端口未打开。大约 10 个连接试图与单个 IP 建立,那么手动打开服务器机器上的 10 个端口,然后在客户端为每个连接分配一个新端口是否可行?还是一次将连接限制为 1 个更好?感谢您的帮助。 在 TCP 中根本不可能有多个具有相同 的连接。该协议没有其他方法来区分连接。通常不为 TCP 设置源端口;例如,我现在使用的网络浏览器正在使用任意源端口。通常的防火墙设置仅基于目标端口进行限制;对源端口进行过滤大多是行不通的。

以上是关于Java 可以并行运行同一个套接字的多个实例吗?的主要内容,如果未能解决你的问题,请参考以下文章

java 多线程问题 真的提高了效率吗?

在多核CPU下,同一进程下的多个线程可以并行运行吗

Java 多线程实现

java中啥叫做线程?啥叫多线程?多线程的特点是啥

Java入门系列-21-多线程

java能利用多核cpu吗