1

クライアントからのデータをリッスンし、データベースに書き込むJavaサーバーアプリケーションを作成しました。2 つのネットワーク カードを搭載した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

これはsudo lshw -class networkコマンドの結果です

~$ sudo lshw -class network
[sudo] password for administrator: 
  *-network               
       description: Ethernet interface
       product: I210 Gigabit Network Connection
       vendor: Intel Corporation
       physical id: 0
       bus info: pci@0000:02:00.0
       logical name: eth0
       version: 03
       serial: 90:1b:0e:0b:11:22
       size: 100Mbit/s
       capacity: 1Gbit/s
       width: 32 bits
       clock: 33MHz
       capabilities: pm msi msix pciexpress bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=igb driverversion=5.0.5-k duplex=full firmware=3.16, 0x800005ae ip=10.0.0.100 latency=0 link=yes multicast=yes port=twisted pair speed=100Mbit/s
       resources: irq:18 memory:f7a00000-f7a7ffff ioport:e000(size=32) memory:f7a80000-f7a83fff
  *-network
       description: Ethernet interface
       product: I210 Gigabit Network Connection
       vendor: Intel Corporation
       physical id: 0
       bus info: pci@0000:03:00.0
       logical name: eth1
       version: 03
       serial: 90:1b:0e:0b:0f:25
       size: 100Mbit/s
       capacity: 1Gbit/s
       width: 32 bits
       clock: 33MHz
       capabilities: pm msi msix pciexpress bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=igb driverversion=5.0.5-k duplex=full firmware=3.16, 0x800005b0 ip=192.168.150.100 latency=0 link=yes multicast=yes port=twisted pair speed=100Mbit/s
       resources: irq:19 memory:f7900000-f797ffff ioport:d000(size=32) memory:f7980000-f7983fff
4

2 に答える 2

0

任意のアドレスを意味するには、null を指定する必要があると思います。

serverSocket.bind(new InetSocketAddress(null,port));

または代わりに:

serverSocket.bind(new InetSocketAddress(port));

どちらも任意のアドレスにマップする必要があります。

于 2015-03-30T12:35:22.867 に答える
0

最後に、複数のゲートウェイを持つ複数のインターフェイスに対して、このソリューションに似たものを使用して解決しました: NetworkManager: per device routing tables

特に、ネットワークを 2 つのサイズに分割し、トンネリング インターフェイスにアドレスを割り当て、もう 1 つのアドレスをイーサネット インターフェイスに割り当てました。

注意すべき唯一のことは、VPNがupの代わりにvpn-upを状態に使用することです。

于 2015-04-13T12:15:04.977 に答える