#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 на сервере, но оно ничего не делает, потому что он работает локально . это свойство должно использоваться на стороне клиента, чтобы знать точную точку размещения сервера.