0

因此,根据下面列出的教程,我目前正在托管一项利用 Oracle 的互操作命名服务 (INS) 的服务。该服务在一台机器上部署了一个servant,并将它注册到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

当我根据教程在同一台机器上使用客户端时,一切正常。但是,当我尝试通过 LAN 进行查找时,当 INS 服务器托管在机器 A 上且客户端位于机器 BI 上时,在缩小参考范围时会出现错误。

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 主机使用了一个未列出但在 /etc/hosts 文件中的 iface,Windows 主机使用了 ipconfig 中列出的最后一个接口的 IP(172.xx.. IP)。在启用网桥的 vbox 上进行了测试。有没有指定网络接口的有效方法?我的要求是服务器和客户端独立存在于同一个局域网上。在服务器上设置 ORBInitialHost 属性没有做任何事情。

4

1 回答 1

0

这里的问题是客户端机器正在本地搜索服务器,这就是它写连接失败的原因:socketType:IIOP_CLEAR_TEXT; 主机名:127.0.1.1;port: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 地址放入 LAN 中。您尝试了服务器上的 ORBInitialHost 属性,但它什么也没做,因为他在本地运行。客户端必须使用此属性才能知道服务器的确切托管点。

于 2021-10-09T21:48:34.687 回答