一.问题描述
1.Java版CORBA程序1——HelloWorld注意事项:
①要转到class文件所在目录启动相应程序;
②名字服务器、服务端和客户端要分别启动一个DOS命令提示符界面。
③可采用批处理命令启动相应程序,分别为:a.启动名字服务器:tnameserv -ORBInitialPort 1050@pause
b.启动服务器端程序:java HelloWorldServer -ORBInitialPort 1050@pause
c.启动客户端程序: java HelloWorldClient -ORBInitialPort 1050@pause
④要求编写实现显示“Hello,World!+班级+中文姓名”字符串。
2. JAVA版CORBA程序2——Counter
3. 要求:编写实现连加、连减和加减混合等数学++/- -运算,并进行测试。
4. 目的:①掌握组件化开发的概念,了解CORBA模型及ORB机制;
②掌握CORBA组件编程方法。
二.具体步骤
1.实现HelloWorld!+班级,姓名
①创建一个文件夹HelloApp,在该文件夹下面创建文本文档:HelloWorld.idl,并添加代码:
module sample{
interface HelloWorld{
wstring sayHello();
};
};
②在命令提示符指定文件目录下面写:idlj -fall HelloWorld.idl;
执行完之后会出现sample文件夹:
③在创建文本文档HelloWorld.idl下创建两个java文档:HelloWorldServer.java和HelloWorldClient.java并添加代码:
HelloWorldServer.java文件:
import sample.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.CORBA.portable.*;
import org.omg.PortableServer.*;
class HelloWorldServant extends HelloWorldPOA{
//对象实现类
public String sayHello() {
return "\nHello World!\t\t软工1704班-张梦茹;
}
}
public class HelloWorldServer{
//服务程序
public static void main(String args[]){
try{
//初始化
ORBORB 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();
//创建伺服对象
HelloWorldServant objRef = new HelloWorldServant();
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);
}
}
}
④在命令提示符下面执行两条语句:
javac HelloWorldServer.java
javac HelloWorldClient.java
⑤HelloApp文件下面会出现class文档:
⑥最后执行三条语句:启动名字服务器:X:\corba >tnameserv -ORBInitialPort 1050
启动服务端程序:X:\corba >java HelloWorldServer -ORBInitialPort 1050
输出:HelloWorld is running
启动客户端程序:X:\corba >java HelloWorldClient -ORBInitialPort 1050
输出:Hello World! 专业班级+姓名
2.实现连加、连减和加减混合等数学++/- -运算
①创建件夹文件夹Counter,并在该文件夹下面创建文本文档counter.idl,并添加代码:
②在命令提示符指定文件目录下面写:idlj -fall counter.idl
出现如下的文件夹:
③在创建文本文档counter.idl下创建三个java文档:Server.java和Client.java和CounterImpl.java并添加代码: Server.java文档:
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);
}
}
}
Client文档:
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);
}
}
}
④在命令提示符下面执行两条语句:
javac Server.java
javac Client.java
⑤Counter文件下面会出现class文档:
⑥最后执行三条语句:
启动名字服务器:X:\corba >tnameserv -ORBInitialPort 1050
启动服务端程序:X:\corba >java Server -ORBInitialPort 1050
输出:Server started. Stop: Ctrl-c
启动客户端程序:X:\corba >java Client -ORBInitialPort 1050
三.调试
1.如果出现了如下问题,需要修改sample文件中HelloWorldPOA.java文档中的代码:
添加红色部分就可以:(方法参考网上修改的)
参考:https://blog.csdn.net/cangbij/article/details/83684843
四.测试
1.实现HelloWorld+班级姓名:
2.实现自增自减:
进行自增自减:
五.总结
在这次上机作业中,我总结一下我遇到的问题:
1.第一次在命令提示符下面运行程序:不会转到指定的盘的文件夹目录下,通过百度我找到了一种方法;
2.然后就是运行过程中:首先是命令符,稍微不注意就会写错,一开始的程序是运行“HelloWorld!”,因为要改成HelloWorld!+班级姓名,因此只需将HelloWorld.idl文档中的string改为wstring,然后就是将HelloworldServer.java文档中的Hello方法重写:
public String sayHello() {
return "\nHello World!\t\t软工1704班-张梦茹";
}
3.就是在后面启动服务端的时候,出现了端口错误,这时将端口号1050改为1051即可解决问题。
不同电脑出现的问题也不相同,这个仅供参考!