技术改变世界 阅读塑造人生! - shaogx.com

This string was altered by TechBlog\Plugins\Example.; This is an example to show the potential of an offcanvas layout pattern in Bootstrap. Try some responsive-range viewport sizes to see it in action.

RMI

RMI-IIOP版的HelloWorld 本文是对RMI-IIOP入门的探究,旨在了解其开发过程,形成感性认识,进而了解其原理和应用。 RMI 和 CORBA 常被视为相互竞争的技术,因为两者都提供对远程分布式对象的透明访问。但这两种技术实际上是相互补充的,一者的长处正好可以弥补另一者的短处。RMI 和 CORBA 的结合产生了 RMI-IIOP,RMI-IIOP 是企业服务器端 Java 开发的基础。RMI-IIOP 很强大的功能之一是,它让您编写纯 Java 客户机/服务器实现而不丧失 RMI 类序列化的灵活性。RMI-IIOP 通过覆盖 Java 序列化并在导线上将 Java 类转换成 IIOP 做到这一点。在另一端,Java 类被作为 IIOP 从导线上读下来,接着创建这个类的一个新实例(使用反射),类的所有成员的值都完整无缺 ― 瞧:这就是 IIOP 上的 Java 序列化!  (以上两段描述来自IBM:http://www.ibm.com/developerworks/cn/java/j-rmi-iiop/,本例的诞生也从中受到启发。) 看来上面觉得RMI-IIOP技术很牛,但是,为什么这么牛的技术在网上就没有一个完整的可运行实例呢,有一篇文章视乎可以运行,但是按照作者的操作结果总是报错。 再回头看看SUN官方的文档,http://java.sun.com/javase/6/docs/technotes/guides/rmi-iiop/rmiiiopexample.html,冠冕堂皇的给出了一个HelloWorld的例子,可是TNND,连编译都不能通过,Google一下,有几万个问及此问题的文章,可是没有一个解决方案。不信你试试!搜索关键字:tPOA.activate_object_with_id( id, tie )对SUN的文档,只能用一个遗憾的感叹号来表达此刻的心情。 抛开官方例子,另外想想办法,最终写出了下面可运行的HelloWorld! 项目目录结构如下:rmiiiopstart └─src         └─lavasoft                 └─rmiiiop  步骤如下: 一、定义远程接口  package lavasoft.rmiiiop; import java.rmi.Remote; import java.rmi.RemoteException; /** * 定义远程接口 * * @author leizhimin 2009-12-9 14:11:34 */ public interface Hello extends Remote {         /**          * 远程接口方法实现          *          * @param name 问候的人名          * @return 问候语          */         String sayHello(String name) throws RemoteException; } 二、实现远程接口(这个实现类也作为服务端)  package lavasoft.rmiiiop; import javax.naming.Context; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; import java.rmi.RemoteException; /** * 远程接口的实现类,必须继承PortableRemoteObject类 * * @author leizhimin 2009-12-9 14:13:46 */ public class HelloImpl extends PortableRemoteObject implements Hello {         /**          * 必须明确的创建一个构造方法,并抛出RemoteException异常          */         public HelloImpl() throws RemoteException {         }         /**          * 远程接口方法实现          *          * @param name 问候的人名          * @return 问候语          */         public String sayHello(String name) throws RemoteException {                 return "Hello, " + name + "!";         }         public static void main(String[] args) {                 try {                         HelloImpl hello = new HelloImpl();                         //创建一个名称上下文,并绑定远程对象                         Context initialNamingContext = new InitialContext();                         initialNamingContext.rebind("HelloImpl", hello);                         System.out.println("Hello Server: Ready and Waiting...");                 } catch (Exception e) {                         e.printStackTrace();                 }         } } 三、开发客户端  package lavasoft.rmiiiop; import javax.naming.Context; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; /** * 客户端应用 * * @author leizhimin 2009-12-9 14:21:35 */ public class HelloClient {         public static void main(String[] args) {                 try {                         //获取一个名称上下文                         Context ic = new InitialContext();                         //得到一个远程对象的引用                         Object objRef = ic.lookup("HelloImpl");                         //强制转换为一个更具体的Hello接口对象                         Hello hello = (Hello) PortableRemoteObject.narrow(objRef, Hello.class);                         // 调用远程对象的方法                         System.out.println("收到来自服务器的消息: " + hello.sayHello("张三") + "\n");                 } catch (Exception e) {                         e.printStackTrace();                 }         } } 四、写编译、生成代码、运行脚本 1、写编译、生成代码代码的脚本 build.batjavac -d . lavasoft/rmiiiop/*.java rmic -classpath . -iiop -d . lavasoft.rmiiiop.HelloImpl  2、启动服务端脚本 runserver.batstart orbd -ORBInitialPort 9999 java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://localhost:9999 lavasoft.rmiiiop.HelloImpl  3、客户端调用脚本java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://localhost:9999 lavasoft.rmiiiop.HelloClient  将三个bat文件放到src下面。 五、编译执行 1、编译并生成代码 2、启动服务端  3、执行客户端  执行了三次,均成功调用并返回结果。 本文出自 “熔 岩” 博客,转载请与作者联系!... 全文

HelloWorld RMI-IIOP 休闲 职场

rmi客户端影响myeclipse中的jar打包问题

做一个涉及到rmi调用的项目,当我采用不编译jar包引用的方式把客户端打包成可执行jar包时,会产生如下错误:java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.net.MalformedURLException: unknown protocol: rsrc... 全文

myeclipse rmi jar

RMI远程方法调用讲解教程

RMI远程方法调用讲解教程1、RMI概述RMI(Remote Method Invocation)RMI是分布式对象软件包,它简化了在多台计算机上的JAVA应用之间的通信。必须在jdk1.1以上RMI用到的类java.rmi.Remote所有可以被远程调用的对象都必须实现该接口java.rmi.server.UnicastRemoteObject所有可以被远程调用的对象都必须扩展该类什么是RMI远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,使用这种机制,某一台计算机上的对象在调用另外一台计算机上的方法时,使用的程序语法规则和在本地机上对象间的方法调用的语法规则一样。优点这种机制给分布计算的系统设计、编程都带来了极大的方便。只要按照RMI规则设计程序,可以不必再过问在RMI之下的网络细节了,如:TCP和Socket等等。任意两台计算机之间的通讯完全由RMI负责。调用远程计算机上的对象就像本地对象一样方便。1、面向对象:RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。也就是说,可以将类似Java哈西表这样的复杂类型作为一个参数进行传递。2、可移动属性:RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。3、设计方式:对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。如果用户能够传递属性,那么就可以在自己的解决方案中使用面向对象的设计方式。所有面向对象的设计方式无不依靠不同的属性来发挥功能,如果不能传递完整的对象——包括实现和类型——就会失去设计方式上所提供的优点。4、安全性:RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。5、便于编写和使用RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松、简单。远程接口实际上就是Java接口。为了实现RMI的功能必须创建远程对象任何可以被远程调用的对象必须实现远程接口。但远程接口本身并不包含任何方法。因而需要创建一个新的接口来扩展远程接口。新接口将包含所有可以远程调用的方法。远程对象必须实现这个新接口,由于新的接口扩展了远程接口,实现了新接口,就满足了远程对象对实现远程接口的要求,所实现的每个对象都将作为远程对象引用。创建远程方法调用的5个步骤:1、定义一个远程接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常。2、定义一个实现该接口的类。3、使用RMIC程序生成远程实现所需的残根和框架。4、创建一个客户程序和服务器进行RMI调用。5、启动Registry并运行自己的远程服务器和客户程序。第一步、扩展远程接口创建一个RMI程序首先要做的就是创建一个扩展远程接口的接口。在这个接口中可以添加任意希望能在远程机器上调用的方法。接口示例import java.rmi.Remote;import.java.rmi.RemoteException;public interface RemoteInterface extends java.rmi.Remote{public String start(String msg) throws RemoteException;}在接口中定义了一个返回字符串的方法本地接口(RemoteInterface)必须是公共的,否则客户机在加载一个实现该接口的远程对象时就会出错。它必须从java.rmi.Remote继承而来,接口中的每一个方法都必须抛出远程异常java.rmi.RemoteException。抛出这个异常的原因由于任何远程方法调用实际上要进行许多低级网络操作,因此网络错误可能在调用过程中随时发生。因此,所有的RMI操作都应放到try-catch块中。第二步、定义一个实现该接口的类。该类必须继承UnicastRemoteObject类。扩展java.rmi.server.UnicastRemoteObjectUnicastRemoteObject顾名思义,是让客户机与服务器对象实例建立一对一的连接。扩展实现接口的类例程服务器关键语句Naming.rebind("/RMITest",rmiTest);//名字和接口绑定第三步、生成残根和框架代码在RMI中,客户机上生成的调动调用参数和反调动返回值的代码称为残根。有的书上称这部分代码为“主干”。服务器上生成的反调动调用参数和进行实际方法调用调动返回值的代码称为框架。生成残根和框架的工具Rmic命令行工具(RMI Compiler)格式:Rmic classname第四步、创建一个客户程序进行RMI调用import java.rmi.Naming;import java.rmi.NotBoundException;import java.rmi.RemoteException;import java.net.MalformedURLException;public class RemoteClientTest{static RemoteInterface gserver=null;void display(){try{//查找远程对象gserver=(RemoteInterface)Naming.lookup("//localhost/RMITest");String msg=gserver.start();System.out.println("服务器返回信息:"+msg);}catch (Exception e1) {System.out.println(e1);}}public static void main (String[] args){RemoteClientTest app=new RemoteClientTest();app.display();}}客户端端关键语句gserver=(RemoteInterface)Naming.lookup("//localhost/RMITest");//查找远程对象第五步、用RmiRegistry找到远程对象这是一个使用工具,维护文本名和远程对象之间的映射,可以进行远程访问。本文出自 ““纯真”程序员俱乐部” 博客,请务必保留此出处http://useway.blog.51cto.com/736087/149172... 全文

Java

JAVA

    这些日子一直在研究SOAP--WebService的东东,发现和JAVA-RMI很相似,他们两个都是基于RPC(Remote Procedure Call)风格。如果想学习SOAP-WebService的朋友,建议先看看JAVA-RMI的知识,自己动手做个HelloWorld,体会一下。一定会对你理解SOAP-WebService有帮助的。   一.先解释一下什么是RPC   一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。         RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用过程接收答复信息,获得进程结果,然后调用执行继续进行。   二.下面详细讲解JAVA-RMI分布式应用       用RMI编写一个分布式应用,核心有以下三方面:     1.定位远程对象       -- 一个应用可以利用RMI的名字服务功能注册器远程对象。       -- 可以象操作本地普通对象一样传送并返回一个远程对象的引用    2.与远程对象通信:       -- 底层的通信由RMI实现,对于系统开发人员来说,远程调用和标准的Java方法调          用没有什么区别。    3.为需要传递的对象装载类的字节码       -- RMI允许调用者向远程对象传递一个对象,因此RMI提供这种装载对象的机制。    下图是JAVA-RMI过程调用图     RMI远程接口: 远程对象必须继承远程接口,确定那些方法是远程方法,为此定义远程接口,远程接口只负责提供方法名,不提供实现细节,因此必须由一个对象来实现接口。 一般来说,实现一个远程接口的类至少有以下步骤: 1.声明远程接口  2.为远程对象定义构造函数 3.实现远程方法  参数传递规则:  1.远程对象通常通过引用传递,一个远程对象的引用是一个stub,它是客户端的代理,它实现远程对象中的远程接口的内容。  2.本地对象通过串行化拷贝到目的,如果不作制定,对象的所有成员都将被拷贝。   下面是实现JAVA-RMI程序  分为以下四个步骤:  1.创建远程接口及声明远程方法(HelloInterface.java)  2.实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)  3.启动RMI注册服务,并注册远程对象(HelloServer.java)  4.客户端查找远程对象,并调用远程方法(HelloClient.java)   最后执行程序:启动服务HelloServer;运行客户端HelloClient进行调用 1.创建远程接口及声明远程方法(HelloInterface.java)  package test.rmi; import java.rmi.*;     /**    * 远程接口必须扩展接口java.rmi.Remote    */    public interface HelloInterface extends Remote     {        /**        * 远程接口方法必须抛出 java.rmi.RemoteException        */       public String say() throws RemoteException;     }     2.实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java) package test.rmi; import java.rmi.*; import java.rmi.server.*; public class Hello extends UnicastRemoteObject implements HelloInterface {     private String message;     public Hello(String msg) throws RemoteException {            message = msg;         }              public String say()throws RemoteException{       System.out.println("Called by HelloClient");       return message;     } } 3.启动RMI注册服务,并注册远程对象(HelloServer.java) package test.rmi; import java.rmi.Naming;     import java.rmi.registry.LocateRegistry;         public class HelloServer     {        /**        * 启动 RMI 注册服务并进行对象注册        */       public static void main(String[] argv)        {           try          {              //启动RMI注册服务,指定端口为1099 (1099为默认端口)              //也可以通过命令 $java_home/bin/rmiregistry 1099启动              //这里用这种方式避免了再打开一个DOS窗口              //而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所用              LocateRegistry.createRegistry(1099);                           //创建远程对象的一个或多个实例,下面是hello对象              //可以用不同名字注册不同的实例              HelloInterface hello = new Hello("Hello, world!");                           //把hello注册到RMI注册服务器上,命名为Hello              Naming.rebind("Hello", hello);                            //如果要把hello实例注册到另一台启动了RMI注册服务的机器上              //Naming.rebind("//192.168.1.105:1099/Hello",hello);                           System.out.println("Hello Server is ready.");           }           catch (Exception e)           {              System.out.println("Hello Server failed: " + e);           }        }     }      4.客户端查找远程对象,并调用远程方法(HelloClient.java) package test.rmi; import java.rmi.Naming;     public class HelloClient     {        /**        * 查找远程对象并调用远程方法        */       public static void main(String[] argv)        {           try          {              HelloInterface hello = (HelloInterface) Naming.lookup("Hello");                            //如果要从另一台启动了RMI注册服务的机器上查找hello实例              //HelloInterface hello = (HelloInterface)Naming.lookup("//192.            168.1.105:1099/Hello");                            //调用远程方法              System.out.println(hello.say());           }           catch (Exception e)           {              System.out.println("HelloClient exception: " + e);           }        }     }      源代码已经写好了,把这四个java文件编译成class文件    G:\workspace\src\testrmi\src\test\rmi>javac *.java  (1)打开一个Dos窗口执行命令 java test.rmi.HelloServer 这就算启动了服务HelloServer    G:\workspace\src\testrmi>java test.rmi.HelloServer    Hello Server is ready.运行成功则可以看到 Hello Server is ready  (2)打开另一个Dos窗口执行命令 java test.rmi.HelloClient运行客户端程序     G:\workspace\src\testrmi>java test.rmi.HelloClient     Hello, world!调用成功则可以看到 Hello, world! 本文出自 “唐大老师” 博客,请务必保留此出处http://tscjsj.blog.51cto.com/412451/85770... 全文

分布式 Java RMI

利用java

为什么要用RMI​在这次的项目中,对于客户端与服务器之间的通信,想了许多办法,由于做的是富客户端应用,最终将技术选定在了RMI和Java-sockets两种之间,其中RMI的灵活性不高,客户端和服务器端都必须是java编写,但使用比较方便,反观java-sockets,虽然比较灵活,但需要自己规定服务器端和客户端之间的通信协议。比较麻烦,几经权衡,最终还是选择RMI来进行服务器-客户端通信... 全文

Java-RMI 远程调用

一次Tomcat溢出的临时处理

    公司服务器上Tomcat不知哪个项目有隐患代码,经常溢出,不停的重启!    起初打算用Jprofiler监控下内存(回头会准备个完整的例子),但发现线上环境bin目录下的.sh被修改的乱七八糟,导致某些.sh无法运行,所以就打算写个RMI的定时gc程序,现用虚拟机模拟下线上环境    环境信息如下:        Red Hat Enterprise Linux Server release 6.3 (Santiago)            Java(TM) SE Runtime Environment (build 1.6.0_45-b06)        apache-tomcat-6.0.41... 全文

Java tomcat rmi jconsole

使用Eclipse SOA Tools Platform插件和Apache Tuscany

window.location.href='http://www.ibm.com/developerworks/cn/edu/os-dw-os-eclipse-soatptuscany.html?S_TACT=105AGX52&S_CMP=tut-cto';【责任编辑:火凤凰 TEL:(010)68476606】原文:使用Eclipse SOA Tools Platform插件和Apache Tuscany返回开发首页... 全文

Eclipse STP 插件 SCA RMI Apache Tuscany ibmdw

阿里云部署Docker(6)

转载请注明来源,本博客原创作者为:http://blog.csdn.net/minimicall?viewmode=contents在Docker使用中,经常会碰到删除镜像不成功,反而让镜像变成了<none > <none>即,没名字,没Tag的镜像。... 全文

Docker删除none镜像 rmi rm docker删除镜像和容器 Docker

1