用CORBA建设Client/Server措施
副标题#e#
如果你想找一个操作面向工具的要领去毗连一个Client到Server,你有两个主要的选择:DCOM和CORBA。DCOM是微软的办理方案,而且当你为WINDOWS系统写代码时很是有用。在本文中,我们将要研究用CORBA去办理漫衍式应用措施问题。
CORBA提要:
在一个凡是的用C++可能JAVA写的面向工具的措施里,措施包括所有应用措施需要用到的类。编译器编译和毗连这些工具,当你用new语句初始化工具时,它们被建设在应用措施地址的内存里而且被看成一个简朴的进程来执行。
CORBA是一种技能答允一个Client措施挪用属于一个Server的工具,这个Server可以是运行在同一台呆板可能是几千里外的呆板。在它的最根基的阶段,CORBA长短常简朴的-实例化一个在你的处理惩罚内存空间的工具取代你在凡是的措施中所做的,你可以实例化这个工具无论在哪一个网络的Server上。挪用这个工具的要领以及这些要领需要通报的参数被打包成网络包的名目发送随处事器上。这个成果实际上是运行在处事器上,返回功效通过网络通报到挪用者。
这种方案的利益是处事器可以作为高效的、共享的资源中心,以Server为基本的CORBA工具可以会见Server的数据库和其它处事。虽然,它的缺点是速度。每秒挪用成果的数目被网络速度严格限制,以便担保其它技能通过网络传输数据,因而,CORBA不是独仪无二的。DCOM,甚至Socket都要忍受同样的延迟。
用CORBA要领出格的方面是可以利便的挪用ORB(Object Request Broker), ORB处理惩罚和操纵Client和Server之间的毗连。在下面的例子里我们将要用Inprise VisiBroker ORB。用VisiBroker,Client和Server都用一个叫做OSAGENT的处事,OSAGENT用一个尺度的端口(凡是是14000)毗连Client,OSAGENT可以看成一个目次去辅佐Client的ORB去找到一个它要找的工具。
用java配置一个简朴的CORBA的Client和Server长短常简朴的,在下面我们将要看到几段例子代码段去显示这个进程,在接下来的部门我们将要表明代码奈何事情的,我们从要害字"安装"开始。
安装
用文档中的例子代码,除了VisiBroker ORB之外你需要下载Sun的JDK1.1,你能下载SDK从http://java.sun.com/products/jdk/1.1/index.html。我们用JDK1.1取代1.2是为了制止和java2的ORB斗嘴。你可以获得VisiBroker ORB从http://www.inprise.com/visibroker/。先装SDK,再装ORB。
例子代码
为了建设一个CORBA Server而且让Client会见它,你要抉择Server类将要做什么再开始。在这个例子里我们要用一个很是简朴的Server类,这个类拥有一个私有的整型变量,在这个类里的一个要领将要增加这个整型变量,而且另一个要领将要答允Client会见这个变量的正确值,下面是这个类的接口描写:
//Counter.idl
module Counter{
interface Count
{
void increment();
long getCounter();
};
};
这个类被定名为Count,它的两个要领是Increment和getCounter,这个类被包括在一个叫Counter的模板中,只要你愿意这个模板可以包括好几个差异的类,把这IDL代码放在一个叫Counter.idl名字的文件中。
为了用这个IDL文件,你需要IDL2JAVA去运行它,这个东西将要创Client和Server要用到的类,IDL2JAVA发生的Client类叫做Helper而且被定名为CountHelper.java,Client用helper类去挪用Server的成果,IDL2JAVA发生的Server类叫做ImplBase而且被定名为_CountImpleBase.java,你将要执行这些Server扩展ImplBase的要领。
留意:当你在Client直接用CounterHelper.java类时,当你挪用一个Counter接口的要领时执行在Client的代码是_st_Counter.java。这个类挪用stub把数据打包发送到Server而且返回正确的数据,它同Server端的skeleton(是_sk_Counter.java,担任与_CounterImplBase.java)通信。
#p#副标题#e#
客户端代码长短常简朴的,下面是你能建设的最小的客户端措施。
// Client.java
public class Client
{
public static void main(String[] args)
{
Counter.Count count = null;
org.omg.CORBA.ORB orb = null;
// Initialize the ORB
orb = org.omg.CORBA.ORB.init();
// Bind to the object on the server
count = Counter.CountHelper.bind(orb, "test");
// Call the server functions
count.increment();
System.out.println("Current Count = " + count.getCounter());
// clean up
count = null;
orb.shutdown();
}
}
在这段代码里你可以看到Client实例化ORB,绑定helper工具为了毗连Server,接着开始挪用要领,为了编译这段代码,储存文件名为Client.java而且输入:
vbjc Client.java
别的,为ORB可以插手三个jar文件到你的Class Path中并其用javac编译Client(三个jar文件是:vbjorb.jar,vbjapp.jar和vbjtools.jar)
如果你想让客户端代码发明问题而且汇报你,你要修改Client.java如下:
#p#分页标题#e#
// Client.java
public class Client
{
public static void main(String[] args)
{
Counter.Count count = null;
org.omg.CORBA.ORB orb = null;
// Initialize the ORB
try
{
orb = org.omg.CORBA.ORB.init();
}
catch (org.omg.CORBA.SystemException se)
{
System.err.println("initializtion problem in the ORB " + se);
System.exit(1);
}
// Bind to the object on the server
try
{
count = Counter.CountHelper.bind(orb, "test");
}
catch (org.omg.CORBA.SystemException se)
{
System.err.println("Binding problem in the ORB " + se);
System.exit(1);
}
try
{
count.increment();
System.out.println("Current Count = " + count.getCounter());
}
catch (org.omg.CORBA.SystemException se)
{
System.err.println("Increment failure " + se);
System.exit(1);
}
// clean up
try
{
count = null;
orb.shutdown();
}
catch (org.omg.CORBA.SystemException se)
{
System.err.println("Problem with cleanup " + se);
System.exit(1);
}
}
}
当你初始化ORB而且绑定到Server时你有多个选项:
1.ORB可以从呼吁行中接管而且阐明这些选项。
2.你可以配置绑定选项。
3.你可以直接连到一个指定的呆板。
下面的代码段为你展示了这三个选项
orb = org.omg.CORBA.ORB.init(args, null);
org.omg.CORBA.BindOptions bindOptions = new
org.omg.CORBA.BindOptions();
bindOptions.defer_bind = false;
bindOptions.enable_rebind = true;
count = Counter.CountHelper.bind(orb, "test", "marshall.iftech.com",
bindOptions);
这是初始化从呼吁行中接管参数,绑定接管了一个指定的呆板名和选项。
在Server你需要建设两段代码,一段为了Client绑定并且执行Count类(Count类担任与ImplBase类),如下所示:
// CountImpl.java
public class CountImpl extends Counter._CountImplBase
{
private int c = 0;
public CountImpl(String name) {
super(name);
}
public CountImpl() {
super();
}
public void increment() {
c = c + 1;
System.out.println(c);
}
public int getCounter()
{
return c;
}
}
这个类不能再少了,它的成果只是实现类里的要领,执行这个类的Server代码如下:
// Server.java
public class Server
{
public static void main(String[] args)
{
org.omg.CORBA.ORB orb = null;
org.omg.CORBA.BOA boa = null;
Counter.Count count = null;
try
{
orb = org.omg.CORBA.ORB.init(args, null);
}
catch (org.omg.CORBA.SystemException se)
{
System.err.println("Initialization problem in the ORB " + se);
System.exit(1);
}
try
{
boa = orb.BOA_init();
}
catch (org.omg.CORBA.SystemException se)
{
System.err.println("Initialization problem in the BOA " + se);
System.exit(1);
}
try
{
count = new CountImpl("test");
boa.obj_is_ready(count);
System.out.println(count + " ready.");
boa.impl_is_ready();
}
catch (org.omg.CORBA.SystemException se)
{
System.err.println("Ready problem " + se);
System.exit(1);
}
}
}
Server代码用Server.java生存,编译这个Serve.java:
? vbjc Server.java
此刻可以测试了,输入如下呼吁:
> osagent
? vbj Server
将要启动Server,输入如下呼吁:
> osfind
> vbj Client
OSFIND呼吁将要确认Server在运行,OSFIND列出它能找到的正在运行的Server和提供处事的工具。第二个呼吁执行Client,你应该看Client和Server在屏幕上打印的计数值的最新值,你可以运行多次客户端措施来增加这个计数值。
Server代码通过初始化ORB开始运行,接着初始化Server的BOA(Basic Object Adapter),BOA的任务是汇报Server 的ORB什么时候Server的类筹备好了,接着Server实例化一个Count工具,定名为"test"而且汇报ORB:Count工具和Server都筹备好了。Imple_is_ready要领答允Server在被外部措施会见以前可以实例化多个工具以及执行其它的初始化。
你可以或许运行Server序在另一台呆板上,它应以两种事情方法的一种就行事情。如果Client和Server在同一个网段,OSFIND通过广播一个请求可以找到Server,如果不在同一个网段,你可以修改客户段代码直接连到Server上。
可以在java措施顶用CORBA,下面的代码显示一个很是简朴的挪用这个例子Server的Applet:
#p#分页标题#e#
// ButtonTest.java
import java.awt.*;
import java.applet.*;
public class ButtonTest extends Applet
{
Button b;
Counter.Count count = null;
org.omg.CORBA.ORB orb = null;
public ButtonTest()
{
setLayout(new BorderLayout());
b = new Button("Apply");
add("North", b);
// ---------
// Bind to the counter
String args[] = new String[10];
args[0] = "test";
try {
orb = org.omg.CORBA.ORB.init();
}
catch (org.omg.CORBA.SystemException se) {
System.err.println("ORB init failure " + se);
System.exit(1);
}
try {
count = Counter.CountHelper.bind(orb, "test");
}
catch (org.omg.CORBA.SystemException se) {
System.err.println("ORB bind failure " + se);
System.exit(1);
}
}
public void paint(Graphics g)
{
long i = count.getCounter();
g.drawString(" " + i, 50, 50);
}
public boolean action(Event ev, Object arg)
{
if (ev.target instanceof Button)
{
try {
count.increment();
}
catch (org.omg.CORBA.SystemException se) {
System.err.println("Increment failure " + se);
System.exit(1);
}
repaint();
return true;
}
return false;
}
}
生存为Button.java而且用下面的呼吁编译:
> vbjc ButtonTest.java
此刻建设一个简朴的web page来挪用这个Applet,如下:
生存为first.htm文件,用applet viewer运行这个applet:
? appleviewer first.htm
任何一个java措施都可以用这个要了解见CORBA。
体会
Client和Server在处理惩罚中都运行了ORB,ORB通过网络辅佐Client和Server相互绑定,辅佐通报参数和激活相应的要领。
用CORBA,Server必需在Client毗连以前运行,当Client实验绑定到Server时,它的ORB开始同OSAGENT对话, OSAGENT列出Server上所有的提供处事工具的名字,默认通信的端标语为14000,OSAGENT知道Server在运行。当Server开始运行时,ORB随机挑选一个端口,而且汇报OSAGENT,接着OSAGENT汇报Client的Server呆板名和ORB的端标语,Client的ORB直接毗连到Server的端口上,通过它挪用所有的要领。
别的,Client和Server在差异的呆板上,可是在同一个网段,则在这个网段里必需有一个OSAGENT在运行,Client和Server通过广播包相互通信。
尚有,Client和Server在差异的网段中,Client则直接连到Server,Server必需运行一个OSAGENT,当Client要连到Server时,它首先和OSAGENT对话获得Server的ORB端标语,接着直接连到Server。
总结
从这个例子中,你可以看到根基的CORBA长短常简朴的,仅仅两三行代码需要加到Client和Server措施中去激活CORBA,毗连好今后,客户和处事器措施用尺度的代码举办通信,CORBA的浅易性使它很是容易的建设Client/Server措施。