Java 如何在多家庭配置中控制源IP

Java 如何在多家庭配置中控制源IP,java,sockets,tcp,multihomed,Java,Sockets,Tcp,Multihomed,我在一个刀片上运行了14个java进程。每个进程都绑定到ProxyServer(F5)识别的虚拟IP,因此当外部客户端调用F5时,他的调用会重定向到14个进程中的一个 最重要的是,我的进程(14个进程之一)对运行在不同刀片服务器上的另一个应用程序执行调用 这里有一个问题:如何在TCP客户端上运行虚拟IP的java进程上控制传出TCP数据包中的源IP?换句话说,我正在寻找一种将虚拟IP设置为传出TCP数据包中的源地址的方法。(默认情况下,它设置为刀片服务器的物理IP)。您可以使用以下套接字构造函数

我在一个刀片上运行了14个java进程。每个进程都绑定到ProxyServer(F5)识别的虚拟IP,因此当外部客户端调用F5时,他的调用会重定向到14个进程中的一个

最重要的是,我的进程(14个进程之一)对运行在不同刀片服务器上的另一个应用程序执行调用


这里有一个问题:如何在TCP客户端上运行虚拟IP的java进程上控制传出TCP数据包中的源IP?换句话说,我正在寻找一种将虚拟IP设置为传出TCP数据包中的源地址的方法。(默认情况下,它设置为刀片服务器的物理IP)。

您可以使用以下套接字构造函数:

Socket(String remoteHost, int remotePort, InetAddress localAddress, int localPort)
或者在创建套接字后使用Socket.bind()


请参见

暂时忘记语言/库。。。为连接套接字定义本地地址和/或本地端口的方法与为侦听套接字定义本地地址和/或本地端口的方法相同。您可以
bind()
将套接字绑定到所需的任何IP地址和/或端口。不绑定与绑定到零值相同


当值为零时,操作系统将为您选择:对于地址,它将绑定到用于发送到目标的接口的地址。对于端口,它将选择一个当前未使用的非特权端口(>1023)。

我已经在下面回答了,但我感兴趣的是您为什么需要这样设置服务器。这听起来不是很有效,一个盒子上的14个JVM需要大量内存。非常感谢您的回答。我们使用14个JVM进行物理内存划分,以避免垃圾收集器的繁重工作,并占用大量CPU时间。每个JVM都使用1G内存,所以每个垃圾收集器应该只使用1G。我理解其原理,但我认为它太细粒度了。我也会使用端口而不是IP地址。另外,为什么您希望客户端绑定到特定端口以进行传出/JVM间通信?主要原因是故障排除。现在我正在寻找++的问题解决方案,也在寻找HTTP连接的问题解决方案。“+”是什么?C++?如果代码中是针对HTTP客户机的,那么答案取决于您使用的是哪个客户机。哪个HTTP java客户机?HTTPConnection?这是一个与所问问题不同的问题。使用Apache HTTPClient,它可以更好地控制套接字,或者参阅此处讨论的解决方法: