Как указать сетевой интерфейс при использовании поиска службы именования с помощью Oracle Java ORB

#java #corba #iiop

Вопрос:

Поэтому в настоящее время я размещаю службу, которая использует совместимую службу именования Oracle (INS) в соответствии с руководством, перечисленным ниже. Эта служба развертывает служащего на одной машине и регистрирует его в INS, мы назовем эту машину A.

 Properties properties = System.getProperties( );
properties.put( "com.sun.CORBA.POA.ORBPersistentServerPort",
    Integer.toString(1060);
ORB orb = ORB.init( args, properties );
ServiceImpl servant = new ServiceImpl( );
POA rootPOA = POAHelper.narrow( orb.resolve_initial_references( "RootPOA" ));
rootPOA.the_POAManager().activate();
rootPOA.activate_object( servant );
((com.sun.corba.se.impl.orb.ORBImpl) orb).
    register_initial_reference("PingService", 
        rootPOA.servant_to_reference(servant));
System.out.println( "INS Server is Ready...");
orb.run();
 

https://docs.oracle.com/javase/8/docs/technotes/guides/idl/INStutorial.html

Когда я использую клиент на той же машине в соответствии с учебником, все работает просто отлично. Однако, когда я пытаюсь выполнить поиск по локальной сети, когда сервер INS размещен на машине A, а клиент находится на машине B, я получаю ошибку при сужении ссылки.

 String[] argv = new String[]{"-ORBInitRef",
    "PingService=corbaloc:iiop:1.2@" 
      ORBIP   ":"   ORBPort   "/PingService"};
ORB orb = ORB.init( argv, null );

org.omg.CORBA.Object object = orb.resolve_initial_references(
    "PingService" );

Service fileRef = ServiceHelper.narrow( object ); // <----- error
 

Я установил сервер как 192.168.0.XXX, и он доступен на машине B, и получаю ошибку где-то в этом роде. AFAIK устанавливается соединение со службой именования и объектом, расположенным в службе, но когда он пытается найти объект, он использует неправильный интерфейс на машине A. Затем ошибка возвращается на машину B.

 com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl <init>
WARNING "IOP00410201: (COMM_FAILURE)Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: 127.0.1.1; port:1060"
org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 201  completed: No
connectFailure
 

Поэтому мой вопрос в том, есть ли способ точно указать, какой интерфейс может использовать служба именования при выполнении поиска? Я попробовал как на хосте Windows, так и на хосте Linux. Хост Linux использовал iface, которого не было в списке, но он был в файле /etc/hosts, а хост Windows использовал IP-адрес последнего интерфейса, указанного в ipconfig (172.xx.. IP). Протестировано как на vbox, так и с включенным мостом. Существует ли эффективный способ указать сетевой интерфейс? Мое требование состоит в том, чтобы сервер и клиент существовали независимо в одной локальной сети. Установка свойства ORBInitialHost на сервере ничего не сделала.

Ответ №1:

проблема здесь в том, что клиентская машина ищет сервер локально, поэтому она записывает сбой подключения: Тип сокета: IIOP_CLEAR_TEXT; имя хоста: 127.0.1.1; порт:1060, поэтому в клиентском коде вместо инициализации свойств, подобных этому :

 String[] argv = new String[]{"-ORBInitRef", "PingService=corbaloc:iiop:1.2@" 
  ORBIP   ":"   ORBPort   "/PingService"};
ORB orb = ORB.init( argv, null );
 

попробуйте инициализировать его следующим образом :

     Properties props = new Properties();
    props.put("org.omg.CORBA.ORBInitialHost",ORBIP);
    props.put("org.omg.CORBA.ORBInitialPort","1060");
    ORB orb = ORB.init(args,props);
 

в переменной ORBIP укажите IP-адрес сервера в локальной сети .
вы пробовали свойство ORBInitialHost на сервере, но оно ничего не делает, потому что он работает локально . это свойство должно использоваться на стороне клиента, чтобы знать точную точку размещения сервера.