You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:18:09