Java版CORBA程序小实例

知识来源:校内上机作业包

实例一:利用组件化的开发方法实现一个简单的Java版CORBA程序–输出“HelloWorld!软件工程1703高洋洋”
具体设计:
(1)在文本文档里编写IDL接口文件。并将其后缀名改为.idl
注意:如果输出中有汉字,则sayHello()中的返回值必须为wstring
在这里插入图片描述
在这里插入图片描述
(2)在桌面创建一个文件夹first(随便命名),将idl文件拉入文件夹,复制一个cmd.exe到这个文件夹中,并将这个cmd.exe默认地址设置为这个文件夹的地址(为了方便后面的操作,不需要写命令的时候改变地址)
在这里插入图片描述
在这里插入图片描述

(3)打开刚刚那个cmd,输入指令:idlj –fall Hello.idl这个命令是编译idl文件,这时候你会发现多出一个文件夹HelloApp(与你编写的idl文件里的命名一样),里面有六个Java文件(这六个文件就是为将来的客户端和服务端提供CORBA服务的)
在这里插入图片描述
在这里插入图片描述

(4)编写并编译HelloClient.java(客户端),编写并编译HelloServer,java(服务端)

//HelloClient.java
import HelloApp.*;  //本应用的Stub类
import org.omg.CORBA.*; //使用CORBA服务
import org.omg.CosNaming.*;//使用CORBA的名字服务
public class HelloClient {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		try{
			//args为客户程序启动时的命令行参数
			ORB orb = ORB.init(args, null);
			//使用ORB的名字服务寻找Hello对象,启动
			org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
			//类型变化
			NamingContext ncRef = NamingContextHelper.narrow(objRef);
			//注册服务类
			NameComponent nc = new NameComponent("Hello",""); 
			NameComponent path[] = {nc}; 
			Hello hello = HelloHelper.narrow(ncRef.resolve(path)); 
			//调用sayHello()方法,把服务端返回的内容显示在屏幕上
			String h = hello.sayHello(); 
			System.out.println(h); 
			} catch (Exception e) {
			System.out.println("ERROR : " + e) ;
			e.printStackTrace(System.out); 
			}
	}
}
//HelloServer.java
import HelloApp.*; //本应用的stub类
import org.omg.CosNaming.*;//要使用CORBA的名字服务
import org.omg.CosNaming.NamingContextPackage.*;//名字服务的例外处理
import org.omg.CORBA.*;//使用CORBA服务
import org.omg.CORBA.portable.*;
import org.omg.PortableServer.*;

class HelloServant extends HelloPOA { // 对象实现类
	public String sayHello() {
		return "\nHello World!软件工程1703高洋洋\n";
	}
}
public class HelloServer { // 服务程序
	public static void main(String args[]) {
		try {
            //初始化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();
            //创建伺服对象 
			HelloServant objRef = new HelloServant();
			Hello 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);
		}
	}
}

(5)编译后文件夹就多出来了他们的.class
(6)注意:接下来三个cmd命令必须在三个cmd窗口分别进行
(7)启动名字服务器:tnameserv -ORBInitialPort 1050
在这里插入图片描述
(8)启动服务端程序:java HelloServer -ORBInitialPort 1050
在这里插入图片描述
(9)启动客户端程序:java HelloClient -ORBInitialPort 1050
在这里插入图片描述
实例二:利用组件化的开发方法实现一个简单的Java版CORBA程序–实现简单的连续加或减或混合加减的运算!

(1)在文本文档里编写IDL接口文件。并将其后缀名改为.idl
在这里插入图片描述
(2)与第一题的第二步相同
在这里插入图片描述
(3)打开刚刚那个cmd,输入指令:idlj –fall Counter.idl
(4)编写并编译对象实现代码:CounterImpl.java,客户端程序: Client.java,服务端程序: Server.java

//Client.java
import CounterApp.*;
import java.util.*;
import java.io.*;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
public class Client {
	public static void main(String[] args) {
		try {
			ORB orb = ORB.init(args, null);
			org.omg.CORBA.Object obj = orb.resolve_initial_references("NameService");
			NamingContext ncRef = NamingContextHelper.narrow(obj);
			NameComponent nc = new NameComponent("Count", "");
			NameComponent path[] = { nc };
			String ref = null;
			try {
				Scanner reader = new Scanner(new File("Counter.ref"));
				ref = reader.nextLine();
			} catch (IOException ex) {
				System.out.println("File error: " + ex.getMessage());
				System.exit(2);
			}
			obj = orb.string_to_object(ref);
			if (obj == null) {
				System.out.println("Invalid IOR");
				System.exit(4);
			}
			Counter c = null;
			try {
				c = CounterHelper.narrow(obj);
			} catch (BAD_PARAM ex) {
				System.out.println("Narrowing failed");
				System.exit(3);
			}
			int inp = -1;
			do {
				System.out.print("Counter value: " + c.value() + "\nAction(+/-/e)?");
				System.out.flush();
				do {
					try {
						inp = System.in.read();
					} catch (IOException ioe) {
					}
				} while (inp != '+' && inp != '-' && inp != 'e');
				if (inp == '+')
					c.inc();
				else if (inp == '-')
					c.dec();
			} while (inp != 'e');
		} catch (Exception ex) {
			System.out.println("Exception: " + ex.getMessage());
			System.exit(1);
		}
	}
}
//Server.java
import CounterApp.*;
import java.io.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.CORBA.portable.*;
import org.omg.PortableServer.*;
public class Server {
	public static void main(String[] args) {
		try {
			ORB orb = ORB.init(args, null);
			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();
			CounterImpl c_impl = new CounterImpl();
			Counter c = c_impl._this(orb);
			NamingContext ncRef = NamingContextHelper.narrow(orb.resolve_initial_references("NameService"));
			NameComponent nc = new NameComponent("Count", "");
			NameComponent path[] = { nc };
			ncRef.rebind(path, c);
			FileOutputStream file = new FileOutputStream("Counter.ref");
			PrintWriter writer = new PrintWriter(file);
			String ref = orb.object_to_string(c);
			writer.println(ref);
			writer.flush();
			file.close();
			System.out.println("Server started." + " Stop:Ctrl-c");
			rootPOA.the_POAManager().activate();
			orb.run();
		} catch (IOException ex) {
			System.out.println("File error:" + ex.getMessage());
			System.exit(2);
		} catch (Exception ex) {
			System.out.println("Exception: " + ex.getMessage());
			System.exit(1);
		}
	}
}
//Counterlmpl.java
import CounterApp.*;

public class CounterImpl extends CounterPOA {
	private int count;

	public CounterImpl() {
		count = 0;
	}

	public void inc() {
		count++;
	}

	public void dec() {
		count--;
	}

	public int value() {
		return count;
	}
}

(5)编译后文件夹就多出来了他们的.class
(6)注意:接下来三个cmd命令必须在三个cmd窗口分别进行
(7)启动名字服务器:tnameserv -ORBInitialPort 1050
在这里插入图片描述
(8)启动服务端程序:java Server -ORBInitialPort 1050
在这里插入图片描述
(9)启动客户端程序:java Client -ORBInitialPort 1050
在这里插入图片描述

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值