Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > RMI-server: прослушивать ip-адреса клиентов


Автор: philips 18.1.2012, 10:16
Добрый день.

Есть такая ситуация: 

на одной машине сконфигурированы несколько (два) сетевых интерфейса с разными сетями

Код

ipconfig /all
...
Ethernet adapter Local Area Connection 4:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : Broadcom NetXtreme Gigabit
Ethernet #2
   Physical Address. . . . . . . . . : 00-0A-E4-81-FC-C9
   DHCP Enabled. . . . . . . . . . . : No
   Autoconfiguration Enabled . . . . : Yes
   IPv4 Address. . . . . . . . . . . : 172.25.231.20(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 172.25.231.1
   DNS Servers . . . . . . . . . . . : 172.25.110.78
   NetBIOS over Tcpip. . . . . . . . : Enabled

Ethernet adapter Local Area Connection 3:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : Broadcom NetXtreme Gigabit
Ethernet
   Physical Address. . . . . . . . . : 00-0A-E4-81-FC-C8
   DHCP Enabled. . . . . . . . . . . : No
   Autoconfiguration Enabled . . . . : Yes
   IPv4 Address. . . . . . . . . . . : 10.10.1.20(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.0.0
   IPv4 Address. . . . . . . . . . . : 10.10.2.20(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.0.0
   IPv4 Address. . . . . . . . . . . : 192.168.231.20(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :
   NetBIOS over Tcpip. . . . . . . . : Enabled
...



RMI сервер, как оказалось, прослушивает адреса только из одной сети.

если указать 
Код

java.rmi.server.hostname=172.25.231.1

то он принимает клиентов только из сети 172.25.231.0, но не из 10.10.0.0.

если указать
Код

java.rmi.server.hostname=10.10.1.20

то он принимает клиентов только из сети 10.10.0.0, но не из 172.25.231.0.

Необходимо, чтобы сервер прослушивал подключения и подключал клиентов из двух сетей сразу.

Что можно сделать??

Заранее спасибо.

Автор: LSD 18.1.2012, 10:27
Попробуй:
Код

java.rmi.server.hostname=0.0.0.0

Автор: philips 18.1.2012, 10:42
LSD, объясни пожалуйста, в общих чертах почему такое происходит, и что означает 0.0.0.0, почему именно такая запись?


Цитата(LSD @  18.1.2012,  10:27 Найти цитируемый пост)
Попробуй

К сожалению, я на своей машине сейчас такое не могу потестить. Такая ситуация на пользовательской машине.

Как там потестят - сразу сообщу.


Автор: LSD 18.1.2012, 10:59
Когда создается http://docs.oracle.com/javase/1.5.0/docs/api/java/net/ServerSocket.html ему можно указать на каком интерфейсе он должен принимать соединения. Адрес 0.0.0.0 обозначает любой интерфест, http://support.microsoft.com/kb/175952/en-us чуточку подробнее.

Автор: philips 18.1.2012, 16:09
Я попробывал у себя, поставить 0.0.0.0:

Если сервер и клиент на одной машине, то проблем нет.

Если сервер и клиент на разных машинах:
Выкидывается исключение на клиенте.
Код

java.rmi.ConnectException: Connection refused to host: 0.0.0.0; nested exception is: 
    java.net.ConnectException: Connection refused: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
    at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
.......
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
    ... 25 more



и это уже после того, как методы getRegistry и lookup выполнены, т.е клиент успешно подрубился к серверу. 
это исключение выскакиевает при вызове метода удаленного объекта (сервера).

И если у сервера поставить адрес локальной машины, например 192.168.117.45, то клиент подключается без проблем.

Я пока не тестировал с двумя сетями, т.к на одной это не работает даже :/

Автор: philips 30.1.2012, 15:23
вот здесь я нашел решение своей проблемы: http://weblogs.java.net/blog/emcmanus/archive/2006/12/multihomed_comp.html

всем спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)