本文的重点是介绍如何用Java一步一步来开发ONC RPC的应用。
有关RPC、ONC、RPCGEN、XDR等概念的介绍可以参考如下网站
http://en.wikipedia.org/wiki/Remote_procedure_call
http://en.wikipedia.org/wiki/RPCGEN
http://en.wikipedia.org/wiki/ONC_RPC
测试相关的所有源代码提供附件下载:rpc_onc_demo.zip
一、开源软件
开源软件:Remotetea (http://sourceforge.net/projects/remotetea/)是用java实现了ONC/RPC
协议,由于是纯100%的Java编写,所以不需要任何本地的库。请在http://sourceforge.net/projects/remotetea/files/remotetea/,下载remotetea-bin-doc-1.0.7.zip(目前最新版本)包并解压,可以在classes文件夹中找到jrpcgen.jar、oncrpc.jar和portmap.jar。
二、RPC语言
RPC语言是XDR语言的控制扩展,与XDR语言一样在RFC1014中定义。句法的注意事项:
a. 有两个保留字:“program”和“version”。
b. 一个程序定义中不能出现两次版本名或版本号。
c. 在一个版本的定义中,过程名称至多只能出现一次。
d. 程序标识与常量和类型标识在同一空间中。
e. 只有无符号常数才能被附值给程序,版本和过程。
三、应用开发
1.创建.x文件:MyRPCDemo.x
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* * my blog: http://www.micmiu.com * mydemo.x -- demonstrates and tests some jrpcgen features. * To compile, use * java -jar jrpcgen.jar -p com.micmiu -nobackup MyRPCDemo.x */ program RPC_ONC_DEMO { version DEMO_FIRST_VERSION { string SayHello(string) = 1;/* 这是过程号 */ } = 1;/* 这是程序号 */ } = 0x20000001;/* 这是版本号 */ /* End of file MyRPCDemo.x */ |
2.运用jrpcgen.jar 生成java文件
1 |
E:\software code\RPC\remotetea-bin\classes>java -Dfile.encoding=utf-8 -jar jrpcgen.jar -p com.micmiu.rpc.onc -nobackup MyRPCDemo.x |
生成后会看到三个文件:MyRPCDemo.java、MyRPCDemoClient.java、MyRPCDemoServerStub.java
详细源代码见上面附件提供的下载。
3.编写ONCRPC服务端代码:MyRPCDemoServer.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
package com.micmiu.rpc.onc; import java.io.IOException; import org.acplt.oncrpc.OncRpcException; /** * blog: http://www.micmiu.com * @author Michael */ public class MyRPCDemoServer extends MyRPCDemoServerStub { public MyRPCDemoServer() throws OncRpcException, IOException { super(); } @Override public String SayHello_1(String arg1) { return "Hi," + arg1 + " Welcome to Myblog: www.micmiu.com"; } /** * * @param args */ public static void main(String[] args) { System.out.println("Starting MyRPCDemoServer..."); try { MyRPCDemoServer server = new MyRPCDemoServer(); server.run(); } catch (Exception e) { System.out.println("MyRPCDemoServer error:"); e.printStackTrace(System.out); } System.out.println("MyRPCDemoServer stopped."); } } |
4.编写客户端测试代码:MyRPCDemoClientTest.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
package com.micmiu.rpc.onc; import java.net.InetAddress; import org.acplt.oncrpc.OncRpcProtocols; /** * blog: http://www.micmiu.com * @author Michael * */ public class MyRPCDemoClientTest { /** * @param args */ public static void main(String[] args) { MyRPCDemoClient client = null; try { client = new MyRPCDemoClient(InetAddress.getByName("127.0.0.1"), OncRpcProtocols.ONCRPC_TCP); } catch (Exception e) { System.out .println("MyRPCDemoClient: error when creating RPC client:"); e.printStackTrace(System.out); } client.getClient().setTimeout(300 * 1000); System.out.println("start to test: "); try { String msg = client.SayHello_1("Michael"); System.out.println("SayHello msg: " + msg); } catch (Exception e) { e.printStackTrace(System.out); return; } } } |
5.测试应用
第一步:先启动jportmap,cmd窗口中运行命令如下:
1 2 |
E:\software code\RPC\remotetea-bin\classes> java -cp .;./* org.acplt.oncrpc.apps.jportmap.jportmap |
第二步:编译运行服务端程序MyRPCDemoServer.java
最后:最后编译运行客户端测试程序MyRPCDemoClientTest.java
执行结果截图如下:
截图中可看出客户端能正常和服务端通信。
原创文章,转载请注明: 转载自micmiu – 软件开发+生活点滴[ http://www.micmiu.com/ ]
0 条评论。