CORBA程序1--HelloWorld(Java版)

 要求编写实现显示“Hello,World!+班级+中文姓名”字符串

1. 使用IDL语言开发开发idl文件,这个文件中描述了接口的定义

module sample{
   interface HelloWorld{
      wstring sayHello();
   };
};

    module:对应了java中的package,

    interface:对应了java中的interface,HelloWorld即接口名称

    sayHello:对应了java中interface声明的方法

    wstring:对应了java中方法的返回值。

    说明:CORBA处理字符串有:Stringwstring两种类型,string类型主要用于处理ASCII类型的字符串,wstring用于处理多字节的字符串,例如:中文。因此本程序使用wstring类型。

2. 使用java中的idlj命令,将idl语言翻译成java语言,并生成java代码

将idl文件拷贝到JDK的bin目录下,然后在命令行下切换到bin目录下执行以下命令:

idlj -fall helloworld.idl

执行此命令后会在bin目录下生成sample文件夹,其中包含6个java类,将这个文件夹直接拷到Eclipse中创建的工程下面的src中,如下图所示:

3. 服务端的实现代码

    在Eclipse创建的工程下的src目录下新建server包,实现服务端的开发

    1)新建HelloWorldImpl类,实现say Hello()方法:

package server;
import sample.HelloWorldPOA;
public class HelloWorldImpl extends HelloWorldPOA {
/*
* 服务端的实现代码
* @see sample.HelloWorldOperations#sayHello()
*/
public String sayHello {
return "helloWorld!,班级,姓名";
}
}

2) HelloWorldServer类,实现server启动的代码,这段代码主要功能是将接口实现注册到ORB中,并启动监听,等待Client客户端来调用:

package server;
	import org.omg.CosNaming.*;
	import sample.HelloWorld;
	import org.omg.CORBA.*;
	public class HelloWorldServer {
	public static void main(String args[]) {
		try {
			args = new String[2];
			args[0] = "-ORBInitialPort";
			args[1] = "1050";
			// 初始化ORB
		ORB orb = ORB.init(args, null);
			// 取根POA的引用
org.omg.CORBA.Object poaobj = orb.resolve_initial_references("RootPOA");
org.omg.PortableServer.POA rootPOA = org.omg.PortableServer.POAHelper.narrow(poaobj);
org.omg.PortableServer.POAManager manager = rootPOA.the_POAManager();
			// 创建伺服对象
		HelloWorldImpl objRef = new HelloWorldImpl();
		HelloWorld obj = objRef._this(orb);
			// 绑定命名服务
NamingContext ncRef = NamingContextHelper.narrow(orb.resolve_initial_references("NameService"));
	NameComponent nc = new NameComponent("Hello", "");
			NameComponent path[] = { nc };
			ncRef.rebind(path, obj);
			// 激活POA管理器
			manager.activate();
			// 等待处理客户程序的请求
			System.out.println("HelloWorld is running!");
			orb.run();
		} catch (Exception e) {
			System.err.println("ERROR: " + e);
			e.printStackTrace(System.out);
		}
	}
}

4. 开发client端的代码

  创建HelloWorldClient类来调用server的方法:

package Client;
import sample.HelloWorld;
import sample.HelloWorldHelper;
import org.omg.CORBA.ORB;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.NotFound;
public class HelloWorldClient {
	static HelloWorld helloWorld;
	 
	static {
		System.out.println("client开始连接server.......");//连接测试
		//初始化ip和端口号,-ORBInitialHost 127.0.0.1 -ORBInitialPort 1050
		String args[] = new String[4];
		args[0] = "-ORBInitialHost";
		//server端的IP地址,在HelloServer中定义的
		args[1] = "127.0.0.1";
		args[2] = "-ORBInitialPort";
		//server端的端口,在HelloServer中定义的
		args[3] = "1050";
		//创建一个ORB实例
		ORB orb = ORB.init(args, null);
		// 获取根名称上下文
		org.omg.CORBA.Object objRef = null;
		try {
		objRef = orb.resolve_initial_references("NameService");
		} catch (InvalidName e) {
			e.printStackTrace();
		}
		NamingContextExt neRef = NamingContextExtHelper.narrow(objRef);
		String name = "Hello";
		try {
			
			//通过ORB拿到了server实例化好的实现类
			helloWorld = HelloWorldHelper.narrow(neRef.resolve_str(name));
		} catch (NotFound e) {
			e.printStackTrace();
		} catch (CannotProceed e) {
			e.printStackTrace();
		} catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
			e.printStackTrace();
		}
		 
		System.out.println("client connected server.......");
	}
	 
	public static void main(String args[]) throws Exception {
		sayHello("");
	}
	//调用实现类的方法
	public static void sayHello(String name) {
		//String str[] = helloWorld.sayHello();
		//String str=helloWorld.sayHello();
		//System.out.print(helloWorld.sayHello());
		String str=helloWorld.sayHello();
		System.out.println(str);
	}
}

服务端与客户端配置好之后,需要在命令行输入命令来启动服务:

          cd /d  %JAVA_HOME%\bin

orbd -ORBInitialPort 1050 -ORBInitialHost 127.0.0.1来启动服务

务端测试:输出HelloWorld is running.

客户端测试,成功输出“Hello,World!+班级+中文姓名”字符串

以上测试程序成功。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值