使用Oracle Java ORB的Naming Service lookup时如何指定网络接口
问题原因
你遇到的问题是Oracle JDK内置CORBA实现的默认行为导致的:服务端生成对象引用(IOR)时,会自动读取主机默认的hostname/IP填充到IOR的地址字段,返回给客户端的IOR里嵌入的是服务端错误的内部IP(比如Linux的127.0.1.1、Windows的虚拟网卡IP),客户端拿到IOR后会尝试连接这个错误地址,因此抛出通信失败错误。你之前设置的ORBInitialHost是客户端用于定位初始命名服务的参数,对服务端绑定暴露的地址不生效。
解决方法
你需要在服务端ORB初始化时,显式指定对外暴露的IP和端口,强制IOR使用你指定的地址。在服务端的Properties配置中新增两个参数即可:
com.sun.CORBA.ORBServerHost:值为服务端对外的局域网IP(也就是你客户端配置的192.168.0.XXX)com.sun.CORBA.ORBServerPort:值为服务端监听的端口,和你之前配置的1060保持一致即可
修改后的服务端示例代码
Properties properties = System.getProperties(); // 新增:指定服务端对外暴露的IP properties.put("com.sun.CORBA.ORBServerHost", "192.168.0.XXX"); // 新增:指定服务端监听端口,可替代原有POA持久端口配置 properties.put("com.sun.CORBA.ORBServerPort", Integer.toString(1060)); 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();
补充优化(可选)
如果服务端IP不固定,不想硬编码,可以通过Java的NetworkInterfaceAPI自动遍历获取对外的物理网卡IP,再赋值给com.sun.CORBA.ORBServerHost参数即可,无需手动修改配置。
验证方式
修改后重启服务端,客户端重新调用即可正常窄化对象。如果要验证IOR里的地址是否正确,可以把服务端生成的对象引用转为字符串打印,解析后即可看到嵌入的IP已经变为你指定的192.168.0.XXX。
内容的提问来源于stack exchange,提问作者delibyamat
相关产品推荐
相关产品推荐

