使用CORBA与CosNaming构建远程服务时连接异常求助
CORBA远程连接失败问题排查与解决
问题背景
尝试使用CORBA+CosNaming构建远程服务,目的是避免客户端硬编码IOR。本地环境下服务端与客户端通信正常,但跨机器远程连接时持续抛出COMM_FAILURE异常。
服务端代码
package server.controller; import org.omg.CORBA.ORB; import org.omg.CosNaming.NameComponent; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; import org.omg.CosNaming.NamingContextPackage.CannotProceed; import org.omg.CosNaming.NamingContextPackage.InvalidName; import org.omg.CosNaming.NamingContextPackage.NotFound; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; import org.omg.PortableServer.POAPackage.ObjectNotActive; import org.omg.PortableServer.POAPackage.ServantNotActive; import org.omg.PortableServer.POAPackage.WrongPolicy; import server.model.BoggleApp.BoggleClient; import server.model.BoggleApp.BoggleClientHelper; import server.model.DataPB; import server.model.ServerImplementation; public class Server{ private ORB orb; private POA rootpoa; private ServerImplementation serverImpl; org.omg.CORBA.Object ref; BoggleClient href; org.omg.CORBA.Object objRef; NamingContextExt ncRef; String path = "WordFactory"; NameComponent[] pathname; public void run(String[] args) { try { this.orb = ORB.init(args, null); this.rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate(); this.serverImpl = new ServerImplementation(); this.ref = rootpoa.servant_to_reference(this.serverImpl); this.href = BoggleClientHelper.narrow(this.ref); this.objRef = orb.resolve_initial_references("NameService"); this.ncRef = NamingContextExtHelper.narrow(objRef); this.path = "WordFactory"; this.pathname = ncRef.to_name(path); ncRef.rebind(this.pathname, this.href); System.out.println("Server is running..."); orb.run(); }catch (Exception e) { e.printStackTrace(); } } public void stop(){ try { rootpoa.deactivate_object(rootpoa.servant_to_id(serverImpl)); System.out.println("Server is stopped."); } catch (WrongPolicy e) { throw new RuntimeException(e); } catch (ObjectNotActive e) { throw new RuntimeException(e); } catch (ServantNotActive e) { throw new RuntimeException(e); } } public static void main(String[] args) { Server s = new Server(); String[] a = {"-ORBINITIALHOST", "localhost", "-ORBINITIALPORT", "10000"}; s.run(a); } public ServerImplementation getServerImpl() { return serverImpl; } }
客户端代码
package client.model; import client.controller.LoginController; //import client.model.BoggleApp.BoggleClient; import client.model.BoggleApp.BoggleClient; import client.model.BoggleApp.BoggleClientHelper; import client.view.LoginView; import org.omg.CORBA.ORB; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; public class Client { private static BoggleClient wfImpl; public void run (String args[]) { try { ORB orb = ORB.init(args, null); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); String name = "WordFactory"; wfImpl = BoggleClientHelper.narrow(ncRef.resolve_str(name)); System.out.println(wfImpl.getFullName("ramon")); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String[] a = {"-ORBINITIALHOST", "192.168.50.160", "-ORBINITIALPORT", "10000"}; Client c = new Client(); c.run(a); } }
报错信息
May 06, 2024 3:03:01 PM com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl <init> WARNING: "IOP00410201: (COMM_FAILURE) Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: 100.118.181.16; port: 59109" org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2200) at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2221) at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:223) at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:236) at com.sun.corba.se.impl.transport.SocketOrChannelContactInfoImpl.createConnection(SocketOrChannelContactInfoImpl.java:119) at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:187) at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.request(CorbaClientDelegateImpl.java:137) at org.omg.CORBA.portable.ObjectImpl._request(ObjectImpl.java:449) at client.model.BoggleApp._BoggleClientStub.getFullName(_BoggleClientStub.java:449) at client.model.Client.run(Client.java:29) at client.model.Client.main(Client.java:40) Caused by: java.net.ConnectException: Connection refused at sun.nio.ch.Net.connect0(Native Method) at sun.nio.ch.Net.connect(Net.java:482) at sun.nio.ch.Net.connect(Net.java:474) at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:647) at java.nio.channels.SocketChannel.open(SocketChannel.java:189) at com.sun.corba.se.impl.transport.DefaultSocketFactoryImpl.createSocket(DefaultSocketFactoryImpl.java:95) at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:207) ... 8 more org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2200) at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2221) at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:223) at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:236) at com.sun.corba.se.impl.transport.SocketOrChannelContactInfoImpl.createConnection(SocketOrChannelContactInfoImpl.java:119) at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:187) at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.request(CorbaClientDelegateImpl.java:137) at org.omg.CORBA.portable.ObjectImpl._request(ObjectImpl.java:449) at client.model.BoggleApp._BoggleClientStub.getFullName(_BoggleClientStub.java:449) at client.model.Client.run(Client.java:29) at client.model.Client.main(Client.java:40) Caused by: java.net.ConnectException: Connection refused at sun.nio.ch.Net.connect0(Native Method) at sun.nio.ch.Net.connect(Net.java:482) at sun.nio.ch.Net.connect(Net.java:474) at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:647) at java.nio.channels.SocketChannel.open(SocketChannel.java:189) at com.sun.corba.se.impl.transport.DefaultSocketFactoryImpl.createSocket(DefaultSocketFactoryImpl.java:95) at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:207) ... 8 more Process finished with exit code 0
解决方案
1. 修改服务器ORB绑定地址
服务器main方法中,ORB初始化参数绑定的是localhost,这会导致服务仅监听本地回环地址,远程客户端无法访问。将其改为服务器的实际IP(如192.168.50.160)或0.0.0.0(监听所有网卡):
public static void main(String[] args) { Server s = new Server(); String[] a = {"-ORBINITIALHOST", "192.168.50.160", "-ORBINITIALPORT", "10000"}; s.run(a); }
2. 确保CosNaming服务正确启动
在服务器端启动命名服务,指定端口为10000:
tnameserv -ORBInitialPort 10000
注意:必须先启动命名服务,再运行服务器程序。
3. 检查防火墙与端口开放
- 确认服务器的10000端口(命名服务端口)和CORBA对象的动态端口(如报错中的59109)已开放,或者临时关闭服务器防火墙测试连接。
- Linux系统可通过
ufw allow 10000/tcp开放端口;Windows系统需在防火墙规则中添加对应端口的允许通行规则。
4. 验证服务器IP可达性
在客户端机器上执行ping 192.168.50.160,确认服务器IP可正常访问;若无法ping通,排查网络连接问题(如子网是否一致、路由器设置等)。
内容的提问来源于stack exchange,提问作者Rithik Tank
相关产品推荐
相关产品推荐

