当前位置:  技术问答>java相关

请教各位高手一个远程调用(RMI)的问题,火烧眉毛!

    来源: 互联网  发布时间:2015-03-18

    本文导语:  启动服务端的程序时,命令行显示:     An Exception occured while creating server 程序本身没什么毛病,是不是该设的路径没设好?  | 你的程序很乱,仔细检查一下,呵呵 加上import java.net.* 运行jav...

启动服务端的程序时,命令行显示:
    An Exception occured while creating server

程序本身没什么毛病,是不是该设的路径没设好? 

|
你的程序很乱,仔细检查一下,呵呵
加上import java.net.*
运行java -Djava.security.policy=xxx.policy myClient试试?
XXX.policy是一文本文件,内容:
grant {
// allows anyone to listen on un-privileged ports
//permission java.net.SocketPermission "*:1024-65535", "listen,accept,connect";
permission java.security.AllPermission;
};

你再对照下面的例子看看:
Java中的远程方法调用
远程方法调用(Remote Method Invocation)机制,就是你利用RMI可以访问别的计
算机上的一个对象,并调用这个远程对象的方法,至于参数传递等细节由RMI处理。RMI是Java1.1引入的分布式对象软件包,它的出现简化了在多台机器上的Java应用之间的通信。相比CORBA,RMI功能较弱且只能用于Java系统。 
      要使用RMI,必须构造四个主要的类:远程对象的本地接口、RMI客户、远程对象实现和RMI服务器。
      远程对象以代码存根形式在网络上传输,而非远程对象通过复制。
Stub存根代码:1。待使用的远程对象的标识符2。被调用方法的说明3。调度的参数
RMI服务器生成远程对象实现的一个实例,并用一个特殊的URL注册它,RMI客户在远程服务器上查找对象,若找到就把它转换成本地接口类型,然后像一个本地对象一样使用它。下面是一个简单的RMI例子,远程对象只返回一个消息字符串。要使这个例子更有价值,我们需要做的就是完善远程对象实现类。
1.程对象的本地接口类(Rem.java) 
该类仅仅是一个接口,而不是实现,RMI客户机可以直接使用它,RMI服务器必须通过一个远程对象来实现它,并用某个URL注册它的一个实例。
import java.rmi.*;
public interface Rem extends Remote { public String getMessage() throws RemoteException;}
本地接口(Rem)必须是公共的,否则客户机在加载一个实现该接口的远程对象时就会出错。此外,它还必须从java.rmi.Remote继承而来,接口中的每一个方法都必须抛出远程异常java.rmi.RemoteException。
2.RMI客户类(RemClient.java)
RMI客户使用Naming.lookup在指定的远程主机上查找对象,若找到就把它转换成本地接口Rem类型,然后像一个本地对象一样使用它。与CORBA不同之处在于RMI客户必须知道提供远程服务主机的URL,这个URL可以通过rmi://host/path或rmi://host:port/path来指定,如果省略端口号,就使用1099。Naming.lookup可能产生三个异常:RemoteException、NotBoundException、MalformedURLException,三个寻常都需要捕获。RemoteException、Naming和NotBoundException在java.rmi.*中定义,MalformedURLException在java.net.*中定义。另外,客户机将向远程对象传递串行化对象Serializable,所以还应在程序中输入java.io.*。
import java.rmi.*;
import java.net.*;
import java.io.*;
public class RemClient { 
public static void main(String[] args) {
try {
String host = (args.length > 0) ? args[0] : "localhost"; //从命令行读取远程主机名 
//通过URL在远程主机上查找对象,并把它转化为本地接口Rem类型 
Rem remObject=(Rem)Naming.lookup("rmi://" + host + "/Rem"); System.out.println(remObject.getMessage()); //调用远程对象的方法 
} catch(RemoteException re) {System.out.println("RemoteException: " + re); 
} catch(NotBoundException nbe) {System.out.println("NotBoundException: " + nbe); 
} catch(MalformedURLException mfe){System.out.println("MalformedURLException:"+ mfe);
}}}
3.远程对象实现类(RemImpl.java) 
这个类真正实现RMI客户调用的远程对象,它必须从UnicastRemoteObject继承,其构造函数应抛出RemoteException异常。
import java.rmi.*; 
import java.rmi.server.UnicastRemoteObject; 
public class RemImpl extends UnicastRemoteObject implements Rem { 
public RemImpl() throws RemoteException {} //构造函数抛出RemoteException异常 
public String getMessage() throws RemoteException { 
return("Here is a remote message."); }} //向RMI客户返回一个消息串 
4.RMI服务器类(RemServer.java) 
该类创建远程对象实现RemImpl的一个实例,然后用一个特定的URL来注册它,所谓注册就是通过Naming.bind或Naming.rebind来将RemImpl实例绑定到URL上。
import java.rmi.*; 
import java.net.*; 
public class RemServer { 
public static void main(String[] args) { 
try {
RemImpl localObject = new RemImpl(); //生成远程对象实现的一个实例Naming.rebind("rmi:///Rem", localObject); //将远程对象实例绑定到rmi:///Rem   上 
}catch(RemoteException re){System.out.println("RemoteException:"+re); 
}catch(MalformedURLException mfe) {System.out.println("MalformedURLException: "+mfe);
}}}
编译和运行 
1.编译RMI客户和服务器,这将自动编译远程对象的本地接口和远程对象实现 
javac RemClient.java //自动编译远程对象的本地接口Rem.java 
javac RemServer.java //自动编译远程对象实现RemImpl.java 
2. 生成客户承接模块和服务器框架 
rmic RemImpl
这将构造RemImpl_Stub.class和RemImpl_Skeleton.class。
将Rem.class、RemClient.class和RemImpl_Stub.class拷贝到RMI客户机,将Rem.class、RemImpl.class 、RemServer.class和RemImpl_Skeleton.class拷贝到RMI服务器。
3. 启动RMI注册 
rmiregistry 
//在服务器上执行。不论有多少个远程对象,本操作只需做一次 
4. 运行 
java RemServer.class 
//启动RMI服务器(在服务器上执行) 
java RemClient.class //启动RMI客户,将输出“Here is a remote message.”

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教一个关于bean的调用问题
  • 请教:如何获得系统调用序列?
  • 请教一下在驱动里怎么调用应用程序
  • 请教gcc编程 问题 关于调用中断 实现 图形模式
  • 请教:java中如何调用linux下的静态连接库.a文件?
  • 请教一个定时调用问题
  • 请教在linux中如何动态的增加一个系统调用(模块中)
  • 请教:java中如何调用linux下的静态连接库.a文件?
  • 请教关于execl()调用的问题
  • 请教,JavaScript中能不能调用JSP写的函数?
  • 请教:系统调用的问题! iis7站长之家
  • 请教:系统调用的问题!
  • 请教Linux中调用系统命令问题
  • 请教各位大牛~~那个系统调用open()创建的是什么类型的文件?
  • 高分请教: 如何用Java调用带多个参数的EXE文件?
  • 请教各位,如何在JSP中调用SQL 过程?
  • 请教怎样在application中调用IE?
  • 请教一下,如何在英文FC3中调用输入法输入中文?
  • [虚心请教]为什么x86内核系统调用没有clone2?
  • 请教一个关于PROC中调用存储过程的问题
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3