文档章节

JAVA RMI 远程接口调用

小乞丐
 小乞丐
发布于 2012/11/11 18:51
字数 775
阅读 1968
收藏 4

摘要: 远程接口发布在192.168.100.2服务器上。 服务端:192.168.100.2 客户端:192.168.100.1 服务器之前通讯正常。

在客户端编码:

<!-- lang: java -->

package com.itf;

import java.rmi.Remote; /**

  • 远程接口定义
  • @author gouwei

*/ public interface RMIInterFace extends Remote{ double add(double a,double b) throws java.rmi.RemoteException; double sub(double a,double b) throws java.rmi.RemoteException; double mul(double a,double b) throws java.rmi.RemoteException; double div(double a,double b) throws java.rmi.RemoteException;

}

package com.itf.impl;

import java.rmi.RemoteException;

import com.itf.RMIInterFace; /**

  • 远程接口实现
  • @author gouwei

*/ public class RMIImpl extends java.rmi.server.UnicastRemoteObject implements RMIInterFace{

   private static final long serialVersionUID = 1L;
  
   public RMIImpl() throws RemoteException {
         super();
  }

   public double add(double a, double b) throws RemoteException {
         return a+b;
  }

   public double sub(double a, double b) throws RemoteException {
         return a-b;
  }

   public double mul(double a, double b) throws RemoteException {
         return a*b;
  }
   public double div(double a, double b) throws RemoteException {
         return a/b;
  }

}

package com.server;

import java.net.MalformedURLException; import java.rmi.AlreadyBoundException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry;

import com.itf.RMIInterFace; import com.itf.impl.RMIImpl; /**

  • 服务端注册
  • @author gouwei

*/ public class RMIServer { public RMIServer(){

         try {
              RMIInterFace rmi = new RMIImpl();
               //端口绑定
              System. setSecurityManager(new java.rmi.RMISecurityManager());
              LocateRegistry. createRegistry(4321);
              Naming. bind("rmi://192.168.100.2:4321/RIMServer", rmi);
              System. out.println(">>>>>> INFO:远程RMIServer绑定【192.168.100.2】成功!" );
        } catch (RemoteException e) {
              System. out.println("创建远程对象发生异常!" );  
              e.printStackTrace();
        } catch (MalformedURLException e) {
              System. out.println("重复绑定发生异常!" );  
              e.printStackTrace();
        } catch (AlreadyBoundException e) {
              System. out.println("URL异常!" );
              e.printStackTrace();
        }
        
  }
  
   public static void main(String args[]) {
       new RMIServer();
     }

}

package com.client;

import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException;

import com.itf.RMIInterFace; /**

  • 客户端远程调用
  • @author gouwei

*/ public class RMIClient {

   public static void main(String[] args) {
         try {
              RMIInterFace rmi = (RMIInterFace)Naming.lookup("rmi://192.168.100.2:4321/RIMServer");
               //add
              System. out.println(rmi.add(10, 5));
               //sub
              System. out.println(rmi.sub(10, 5));
               //mul
              System. out.println(rmi.mul(10, 5));
               //div
              System. out.println(rmi.div(10, 5));
        } catch (MalformedURLException e) {
              e.printStackTrace();
        } catch (RemoteException e) {
              e.printStackTrace();
        } catch (NotBoundException e) {
              e.printStackTrace();
        }
  }

}

编码完成之后,将编译后的客户端接口、接口实现类、服务端注册类、拷贝到192.168.100.2服务器上。 在C盘根目录编写安全策略文件 server.policy: grant{ permission java.net.SocketPermission "192.168.100.2:4321","accept,connect,resolve"; };

一、在192.168.100.2上执行命令: (1) start rmiregistry(windows) rmiregistry(linux) (2) cd到bin路劲执行:java com.itf.impl.RMIImpl 生成RMIImpl_Stub.class文件 (3) cd 到bin路劲执行:java -Djava.security.policy=C:\server.policy com.server.RMIServer 输出: C:\TestRMI_3\bin>java -Djava.security.policy=C:\server.policy com.server.RMIServer

INFO:远程RMIServer绑定【192.168.100.2】成功!

如果输出报错: C:\TestRMI_3\bin>java -Djava.security.policy=C:\server.policy com.server.RMIServ er Exception in thread "main" java.security.AccessControlException: access denied ( java.net.SocketPermission 192.168.100.2:4321 connect,resolve) at java.security.AccessControlContext.checkPermission(AccessControlConte xt.java:323) at java.security.AccessController.checkPermission(AccessController.java: 546) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034) at java.net.Socket.connect(Socket.java:513) at java.net.Socket.connect(Socket.java:469) at java.net.Socket.<init>(Socket.java:366) at java.net.Socket.<init>(Socket.java:180) at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirect SocketFactory.java:22) at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMaster SocketFactory.java:128) at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595) at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198 ) at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184) at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322) at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source) at java.rmi.Naming.bind(Naming.java:111) at com.server.RMIServer.<init>(RMIServer.java:20) at com.server.RMIServer.main(RMIServer.java:36)

【更改服务端C:\Program Files\Java\jdk1.6.0_10\jre\lib\security\java.policy 安全策略文件 在文件中加入server.policy中权限内容: permission java.net.SocketPermission "192.168.100.2:4321","accept,connect,resolve"; 或则 permission java.net.SocketPermission "*","accept,connect,resolve"; 然后重复3的操作即可。】 二、在客户端上执行:

(1) 保留远程接口和接口实现class,将生成RMIImpl_Stub.class文件拷贝到客户端“远程接口实现RMIImpl.class文件同级”。 (2) 运行客户度程序 cd到bin路劲下执行:java -Djava.security.policy=com.client.RMIClient 输出: F:\Workspaces\TestRMI_4\bin>java -Djava.security.policy= com.client.RMIClient 15.0 5.0 50.0 2.0

Spring RMI 配置

<!-- RMICLIENT CLIENT-SERVER -->

  <bean id="serviceClient"  
        class="org.springframework.remoting.rmi.RmiProxyFactoryBean">  
        <property name="serviceInterface">  
           <value>com.qq.db.DBUser</value>  
       </property>  
       <!-- serviceUrl以rmi开头,定义服务器地址与端口和服务名 -->  
       <property name="serviceUrl" value="rmi://${servers.server}:${servers.port}/${server.serverName}" />  
       <property name="lookupStubOnStartup">
	     <value>false</value>
	  </property> 
       <property name="refreshStubOnConnectFailure">
			<value>true</value>
	 </property> 
   </bean>  

© 著作权归作者所有

小乞丐

小乞丐

粉丝 10
博文 6
码字总数 2120
作品 0
成都
高级程序员
私信 提问
RMI:Java中的分布式计算框架

RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。其实...

qq_39521554
2018/05/15
0
0
用RMI实现基于Java的分布式计算(1)

向您介绍使用RMI实现Java的分布式计算。由于Java具有跨平台、代码可移植性、安全高效等广泛而强大的功能,因而在开发网络Java分布式应用的时候,可以用它自身的机制实现分布式计算。 概述 随...

山哥
2012/02/24
527
0
Java RMI之HelloWorld篇

Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该...

方绍伟
2013/09/18
278
0
java RMI 源码总结(个人理解)

明天早上详细写下两个过程: 1、初始化过程(服务器) 2、客户端调用过程(包括客户端流程、调用服务端流程、返回客户端流程) 当客户端通过RMI注册表找到一个远程接口的时候,所得到的其实是...

Java搬砖工程师
2018/11/16
102
0
【亲测】RMI之Hassion

一、RMI RMI(Remote Method Invocation,远程方法调用)是Java在JDK1.2中实现的, Java RMI 支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。(即它能...

Armymans
2018/11/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
6
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部