Java Server на нескольких сетевых интерфейсах

Я написал серверное приложение 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

Это результат команды 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

person Niles    schedule 30.03.2015    source источник
comment
Насколько я знаю, вызов InetSocketAddress(hostname, port) не создаст подстановочный сокет в Java 8. Попробуйте использовать только InetSocketAddress(port)   -  person aw-think    schedule 30.03.2015
comment
Все еще не работает, это что-то странное, когда я подключаю только один интерфейс, он работает, когда я подключаю оба интерфейса, он перестает работать, а когда я отключаю eth0, он перезапускается, как будто приложение не может управлять обоими интерфейсами   -  person Niles    schedule 30.03.2015
comment
Обычно он принимает соединения на любом интерфейсе для данного порта. Так что, возможно, есть еще одна проблема в вашей конфигурации/программном обеспечении.   -  person aw-think    schedule 30.03.2015
comment
Я только что попробовал VPN-соединение своего компьютера, и у меня такая же проблема. Любая идея о проблеме? Должен быть правильный путь для исправления   -  person Niles    schedule 30.03.2015
comment
Возможно ли, что Linux не управляет несколькими сетевыми интерфейсами?   -  person Niles    schedule 31.03.2015
comment
Пожалуйста, опубликуйте содержимое вашего /etc/network/interfaces. И, пожалуйста, запустите следующую команду и опубликуйте вывод: sudo lshw -class network   -  person aw-think    schedule 31.03.2015
comment
ответ в обновлении поста   -  person Niles    schedule 01.04.2015
comment
Как настроить eth0 и eth1? С сетевыми менеджерами или Wicd? Обычно лучший способ настроить систему с несколькими сетевыми интерфейсами — статический, потому что у вас может быть только один шлюз. Несколько сетевых интерфейсов. Поэтому сначала настройте свою сеть, а затем запустите приложение.   -  person aw-think    schedule 02.04.2015
comment
Я не использовал Network Manager или Wicd, я настроил адрес и шлюз статически, но с двумя разными шлюзами. Как вы думаете, проблема в этом? Должен ли я устанавливать интерфейсы только с одним шлюзом?   -  person Niles    schedule 07.04.2015
comment
Ваша система может работать только с одним шлюзом по умолчанию. Итак, если у вас настроено более одного шлюза, как ваша система должна знать, какой маршрут выбрать для исходящей сети? Только если вы выполняете маршрутизацию с отдельными сетями, это будет работать как шарм. Или приоритезировать метрику на одном интерфейсе. Но удалить один шлюз и попробовать снова — самый простой способ. Кстати: Где вы настраиваете статическую сеть? Обычно в Ubuntu статическая конфигурация выполняется в /etc/network/interfaces   -  person aw-think    schedule 07.04.2015
comment
Спасибо за объяснение!! :D Я как можно скорее перенастрою систему и выложу сюда новую /etc/network/interfaces не знаю почему предыдущая была пуста   -  person Niles    schedule 07.04.2015
comment
Вы правы, подключение настраивается через Network Manager.   -  person Niles    schedule 07.04.2015
comment
Я рекомендую настроить его статическим в файле /etc/network/interfaces. Таким образом, ваша сеть работает с момента загрузки правильно. После этого вы можете попробовать подключить клиентов к целевому IP-адресу вашего настроенного сервера. Клиенты должны находиться в одной подсети для вызова сервера, иначе вам потребуется маршрутизация.   -  person aw-think    schedule 08.04.2015


Ответы (2)


Я думаю, вам нужно указать null для обозначения любого адреса:

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

или альтернативно:

serverSocket.bind(new InetSocketAddress(port));

оба должны сопоставляться с любым адресом.

person Felice Pollano    schedule 30.03.2015

Наконец, я решил использовать что-то похожее на это решение для нескольких интерфейсов с несколькими шлюзами: NetworkManager: таблицы маршрутизации для каждого устройства

В частности, я разделил сеть на два размера, назначив один адрес туннельному интерфейсу, а другой — интерфейсу Ethernet.

Единственное, на что следует обратить внимание, это то, что вместо up VPN использует для своего состояния vpn-up.

person Niles    schedule 13.04.2015