Corba code

2024-01-23 06:32
文章标签 code corba

本文主要是介绍Corba code,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 环境:jdk1.4, JacORB 2.2
Java.sun.com
www.jacorb.org

CORBA构架的基本结构:


虚线表示请求,实线表示信息传递


第一步:实现Server端:
    基本的CORBA-Server实现包括一下几部分内容
1、    定义IDL接口
module Module1 {
  interface Interface1 {
    string operation1(in string param1);
  };
};

2、    使用idlj生成CORBA应用辅助类(包括存根和Helper类)
Idlj命令参数简介
a)    -fall:生成客户端和服务器端的代码
b)    -fclient、-fserver:只生成客户端或服务器端代码
c)    -oldImpBase:生成旧版本的 *ImpBase代码
我们在网上查到的代码经常(>90%)包含****ImpBase.java 文件,而jdk1.4的默认实现基类变为*****POA(其实不光是名称变了,同时涉及ORB实现的变化)。
=============================
Idlj将生成以下文件,包名为Module1
Interface1Holder.java
Interface1Operations.java  //真正的业务应用中要使用的接口
Interface1POA.java       //继承这个类实现业务功能
_Interface1Stub.java
Interface1.java
Interface1Helper.java

只用Interface1Operations,Interface1POA两个部分需要我们关心
=============================
使用BES(Borland Enterprise Server)生成的辅助类也可以使用,需要在Enterprise Setup中配置visiBroker/path for ORB tools.
然后右键点 idl文件Make,就会生成相应的文件,但不能的工程目录下看见这些文件(即只能在Jbuilder中看这些文件),比较别扭。另外代码中会有对borland接口的依赖,所以不推荐使用。

3、    编写接口的真正实现――我们的业务代码
继承Interface1POA实现业务代码:
public class Interface1Impl  extends Module1.Interface1POA{
public String operation1(String para1) {
    System.out.println("Client Call in." + para1);
    return "Server is returned " + para1;
  }


4、    编写IOR存储、交互程序
IOR:包含服务器、端口号、对象标识等内容,Client ORB通过该信息可以连接到服务器端ORB从而,进行通信。

该标识是一个字符串类,例如:
IOR:000000000000002b49444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f6e746578744578743a312e300000000000010000000000000084000102000000000f3138322e3131392e3131312e353900000384000000000035afabcb0000000020743459d00000000100000000000000010000000d544e616d65536572766963650000000000000004000000000a0000000000000100000001000000200000000000010001000000020501000100010020000101090000000100010100

常见的可以使用文件作为IOR存储交换解质
另外通过命名服务进行ORB.Object存储、交换也可以。

使用文件存储的代码:
System.getProperties().put("org.omg.CORBA.ORBClass",
                                    "org.jacorb.orb.ORB");
System.getProperties().put("org.omg.CORBA.ORBSingletonClass",
                                    "org.jacorb.orb.ORBSingleton");
ORB orb = ORB.init( args, null );
POA poa =POAHelper.narrow( orb.resolve_initial_references( "RootPOA" ));
poa.the_POAManager().activate();
Interface1Impl impl = new Interface1Impl();
org.omg.CORBA.Object obj =poa.servant_to_reference( impl );
PrintWriter pw = new PrintWriter( new FileWriter( "c:/test.txt" ));
pw.println( orb.object_to_string( obj )); 
pw.flush();
pw.close();

使用命名服务的代码:(使用jdk1.4:tnameserv作为服务器)
如果:
org.omg.CORBA.ORBClass:com.sun.corba.se.internal.Interceptors.PIORB
(com.sun.corba.se.internal.Interceptors.PIORB包含在jdk-dt.jar中)
则:
String paras[] = { "-ORBInitialHost", "127.0.0.1", "-ORBInitialPort", "900"}
           ORB orb = ORB.init(paras, null );

            如果:
            org.omg.CORBA.ORBClass:org.jacorb.orb.ORB
则:
要建立 jacorb.properties文件,并放在classpath中
添入以下配置串:
ORBInitRef.NameService=corbaloc::127.0.0.1:900/NameService

============================
org.omg.CORBA.Object objRef = null;  //命名服务也使用自身传出Context
objRef = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
Interface1Impl impl = new Interface1Impl();
org.omg.CORBA.Object objImpl =poa.servant_to_reference( impl );
NameComponent nc = new NameComponent("MyService", "");
NameComponent path[] = {nc};
ncRef.rebind(path, objImpl);

注:请自行添加try-catch异常处理代码。

5、    编写Server启动代码
orb.run();

  
第二步:实现Client端:
1、    定义IDL接口
2、    使用idlj生成CORBA应用辅助类
3、    获取IOR:
a)    通过文件
java.util.Properties props = new java.util.Properties();
props.setProperty("org.omg.CORBA.ORBClass", org.jacorb.orb.ORB");
props.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
      ORB orb = ORB.init(args, props);
FileInputStream f = new FileInputStream("c:/test.txt");
byte[] buf = new byte[f.available()];
f.read(buf, 0, f.available());
String ior = new String(buf);
org.omg.CORBA.Object obj = orb.string_to_object(ior);

b)    通过命名服务
org.omg.CORBA.Object objRef = null;
objRef = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
NameComponent nc = new NameComponent("MyService", "");
NameComponent path[] = {nc};
org.omg.CORBA.Object obj= ncRef.resolve(path);


4、    调用远程对象:
Interface1Operations remObject = Interface1Helper.narrow(obj);
System.out.println(remObject.operation1("Client1"));

这篇关于Corba code的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/635505

相关文章

Debugging Lua Project created in Cocos Code IDE creates “Waiting for debugger to connect” in Win-7

转自 I Installed Cocos Code IDE and created a new Lua Project. When Debugging the Project(F11) the game window pops up and gives me the message waiting for debugger to connect and then freezes. Also a

LLVM入门2:如何基于自己的代码生成IR-LLVM IR code generation实例介绍

概述 本节将通过一个简单的例子来介绍如何生成llvm IR,以Kaleidoscope IR中的例子为例,我们基于LLVM接口构建一个简单的编译器,实现简单的语句解析并转化为LLVM IR,生成对应的LLVM IR部分,代码如下,文件名为toy.cpp,先给出代码,后面会详细介绍每一步分代码: #include "llvm/ADT/APFloat.h"#include "llvm/ADT/S

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置:  // launch.json{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information,

code: 400, msg: Required request body is missing 错误解决

引起这个错误的原因是,请求参数按照get方式给。 应该给json字符串才对 补充: 1. @RequestBody String resource 加@RequestBody必须给json字符串,否则会报错400,记如标题错误。 不加这个的进行请求的话,其实post和get就没有什么区别了。 2. List<String> indexCodes=(List<String>)json.

iOS项目发布提交出现invalid code signing entitlements错误。

1、进入开发者账号,选择App IDs,找到自己项目对应的AppId,点击进去编辑, 2、看下错误提示出现  --Specifically, value "CVYZ6723728.*" for key "com.apple.developer.ubiquity-container-identifiers" in XX is not supported.-- 这样的错误提示 将ubiquity

解决服务器VS Code中Jupyter突然崩溃的问题

问题 本来在服务器Anaconda的Python环境里装其他的包,装完了想在Jupyter里写代码验证一下有没有装好,一运行发现Jupyter崩溃了!?报错如下所示 Failed to start the Kernel. ImportError: /home/hujh/anaconda3/envs/mia/lib/python3.12/lib-dynload/_sqlite3.cpython-

Behind the Code:与 Rakic 和 Todorovic 对话 OriginTrail 如何实现 AI 去中心化

原文:https://www.youtube.com/watch?v=ZMuLyLCtE3s&list=PLtyd7v_I7PGnko80O0LCwQQsvhwAMu9cv&index=12 作者:The Kusamarian 编译:OneBlock+ 随着人工智能技术的飞速发展,一系列前所未有的挑战随之而来:模型的衰退与互联网的潜在威胁愈发明显。AI 的增长曲线可能因训练过程中的瓶颈而趋于平

冒泡排序和鸡尾酒排序(code)

昨天回顾了下冒泡排序和鸡尾酒排序,用面向对象的方式写了一下,并且优化了代码,记录一下~ 一、冒泡排序 # 冒泡排序class BubbleSort(object):def __init__(self, data_list):self.data_list = data_listself.length = len(data_list)# 简单粗暴的排序方式def b_sort(self):d

编译时出现错误 -- clang: error: linker command failed with exit code 1 (use -v to see invocation)

出现这个错误的原因有多种,常见的是因为某些文件的缺失或者是文件的重复导致的。 这类错误查看的关键在于其上一行的文字。 对于文件缺少而导致错误的情况: 例如上图中的示例,其上一行文字为 ld:library not found for -lrxl,可以看出是缺失了某一文件而导致的错误,这行文字中的最后“ -lrxl ”:-l 代表着其前缀是“lib”,连着后面的 rxl,其名称为 libr

GCDAsyncUdpSocket 使用时出现错误 Domain=NSPOSIXErrorDomain Code=13 Permission denied

完整的错误描述为: Domain=NSPOSIXErrorDomain Code=13 "Permission denied" UserInfo={NSLocalizedDescription=Permission denied, NSLocalizedFailureReason=Error in send() function.} 原始代码是这样的: clientBroadcast