Java 设置JVM本地网络接口

Java 设置JVM本地网络接口,java,networking,Java,Networking,如何告诉JVM绑定哪个网络接口?就我的一生而言,我在文档或谷歌搜索中找不到任何与此相关的参考资料。我的机器有多个接口,我想使用一个不是默认的特定接口。是否有commmandline参数?是的,我可以在java.net.Socket.bind(laddr)的代码中设置它,但这意味着查找和更改所有这样的实例,这是不必要的困难。必须有一种方法可以为整个JVM实现这一点。还是在操作系统级别 更新:正如人们所说,令人惊讶的是,在JVM级别没有办法做到这一点。不幸的是,我们在LDAP和DNS中使用JNDI,

如何告诉JVM绑定哪个网络接口?就我的一生而言,我在文档或谷歌搜索中找不到任何与此相关的参考资料。我的机器有多个接口,我想使用一个不是默认的特定接口。是否有commmandline参数?是的,我可以在java.net.Socket.bind(laddr)的代码中设置它,但这意味着查找和更改所有这样的实例,这是不必要的困难。必须有一种方法可以为整个JVM实现这一点。还是在操作系统级别


更新:正如人们所说,令人惊讶的是,在JVM级别没有办法做到这一点。不幸的是,我们在LDAP和DNS中使用JNDI,正如我所知,在JNDI中也没有覆盖的方法(大概是因为JNDI实际上只是各种实现的包装器)。这意味着要么尝试在JVM级别重写ServerSocketImpl(不清楚是否可以这样做,它也不处理TLS套接字),要么必须在操作系统级别重写ServerSocketImpl(例如使用“docker”)。在我看来,这是Java中的一个BUG。

除非您有一个强大的主机模型操作系统,例如Linux,否则即使您指定了接口,操作系统也可以随意忽略您的提示。您可以在容器(例如docker)中运行,docker只能访问一个接口。当程序启动时,您可以使用
Socket.setSocketImplFactory(SocketImplFactory)
覆盖新套接字的默认行为并每次设置接口。您似乎对为serversocket选择默认IP地址感兴趣,不太像一个网络接口(MAC),对吗?我的猜测是,看看操作系统,看看改变度量(路由成本)或者操作系统深度的某些列表顺序是否可以让jvm选择它。但是要注意,大多数体面的服务器程序都有一个cfg来规范监听IP;这是意料之中的事,它也显示出违约也没有可靠的机制。很抱歉,但是您确实应该更改您的代码以获取系统属性。即使有100个位置需要修复,仍然值得一做。