多网络接口上的Java服务器

多网络接口上的Java服务器,java,server,network-interface,Java,Server,Network Interface,我编写了一个Java服务器应用程序,它侦听来自客户端的数据,然后写入数据库。 我在一台带有两张网卡的linux Ubuntu 12.04计算机上运行该应用程序。当我在启用单个网络接口的情况下连接到网络时,它工作得非常好,但是当我启用两个网络接口时,我只能从连接到eth0的客户端接收数据 我的服务器的代码几乎是经典的: String address = "0.0.0.0"; serverSocket = new ServerSocket(); serverSocket.bi

我编写了一个Java服务器应用程序,它侦听来自客户端的数据,然后写入数据库。 我在一台带有两张网卡的linux Ubuntu 12.04计算机上运行该应用程序。当我在启用单个网络接口的情况下连接到网络时,它工作得非常好,但是当我启用两个网络接口时,我只能从连接到eth0的客户端接收数据

我的服务器的代码几乎是经典的:

    String address = "0.0.0.0";
    serverSocket = new ServerSocket();
    serverSocket.bind(new InetSocketAddress(address,port));

    while (true) {
            Socket clientSocket = null;
            try {
                clientSocket = serverSocket.accept();
                System.out.println("\n----Connection accepted----");
                ConnectionHandler handler = new ConnectionHandler(clientSocket, mysql);
                Thread handlerThread = new Thread(handler);
                handlerThread.setPriority(Thread.NORM_PRIORITY);
                handlerThread.start();
           catch(Exception exc){
                //catch statement
           }
     }
这个问题有些奇怪,因为地址0.0.0.0应该创建一个监听所有接口的套接字

有什么能给我建议如何解决这个问题吗

编辑: 问题可能出在SO设置中

这是我的/etc/network/interfaces文件的内容:

auto lo
iface lo inet loopback
这是sudolshw-class网络命令的结果


我认为您需要指定null来表示任何地址:

serverSocket.bind(new InetSocketAddress(null,port));
或作为替代:

serverSocket.bind(new InetSocketAddress(port));

两者都应该映射到任何地址。

最后,我使用类似于此解决方案的方法解决了具有多个gataway的多接口问题:

特别是,我将网络分为两种大小,分别为隧道接口和以太网接口分配了一些地址


唯一需要注意的是,VPN使用VPN up作为其状态,而不是up。

据我所知,调用InetSocketAddresshostname,port不会在Java 8上生成通配符套接字。尝试仅使用InetSocketAddressPort仍不工作,这是一件奇怪的事情,当我只连接一个接口时它工作,当我连接两个接口时它停止工作,当我断开eth0时它重新启动工作,这就像应用程序无法正常管理两个接口一样,它接受给定端口的任何接口上的连接。因此,也许您的配置/软件中还有另一个问题。我刚刚尝试了我的计算机的VPN连接,我也遇到了同样的问题。你知道这个问题吗?应该有一个正确的路径来修复它您的系统只能处理一个默认网关。所以,如果您配置了多个网关,您的系统应该如何知道到出站网络的路由?只有当你使用不同的网络进行路由时,这才是一种魅力。或者对一个接口上的度量设置优先级。但删除一个网关并重试是最简单的方法。顺便问一下:你在哪里配置你的静态网络?通常在Ubuntu上,静态配置将在/etc/network/interfaces中完成
serverSocket.bind(new InetSocketAddress(port));