java RMI 如何返回远程对象的引用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java RMI 如何返回远程对象的引用相关的知识,希望对你有一定的参考价值。

服务器端

1.进入jdk的bin目录 :

cd $JAVA_HOME/bin

2.在该目录下新建文本jstatd.all.policy:

vim jstatd.all.policy

3.添加内容:

grant codebase "file:$java.home/../lib/tools.jar"  
permission java.security.AllPermission;  
;

4.在该目录启动jstatd服务:

./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=<你服务器的ip> -p 1099

本地

1.进入jdk的bin目录,打开jvisualvm.exe

2.界面左侧目录‘远程’点击右键添加主机,输入你的服务器ip,端口和jstatd服务的启动端口一致。

老司机带你分析SpringMVC框架设计原理与实现

链接:https://pan.baidu.com/s/1cksL0_VmSMdkIXWFSOx19g

密码:57w4

Netty粘包分包现象及解决方案实战,防socket攻击

链接:https://pan.baidu.com/s/1kTF2oqHOqvrPJrKa7TpXOQ

密码:dk9n

大型企业级高并发下数据库水平切分之读写分离技巧详解

链接:https://pan.baidu.com/s/1OrXSGCCboqgVX2vgfC7Z7Q

密码:ri8q

分布式事务出现场景及解决方案详细剖析

链接:https://pan.baidu.com/s/1BBf6cePibN0xawFEY7A6ZA

密码:380p

以上都是小编收集了大神的灵药,喜欢的拿走吧!喜欢小编就轻轻关注一下哦!

参考技术A

利用java的对象序列化和反序列化来传递对象就OK了。

序列化需要实现接口Serializable
需要定义序列化id serialVersionUID;

大致代码如下:

private static void SerializePerson() throws FileNotFoundException, IOException 
Object obj = new Object();
// ObjectOutputStream 对象输出流,将对象存储到E盘的obj.txt文件中,完成对Object对象的序列化操作
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(new File("E:/obj.txt")));
os.writeObject(obj);
System.out.println("序列化成功!");
os.close();


private static Object DeserializePerson() throws Exception, IOException 
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("E:/obj.txt")));
Object obj = ois.readObject();
System.out.println("反序列化成功!");
return obj;

另外有点好奇RMI这玩意多麻烦呀,老早就没啥人用了吧。。。。。。

对了 序列化成JSON格式,接收后再转换回来会更方便!

参考技术B 12//接口声明public interface DynamicRemote extends Remote public double getNowPrice(String stock_code) throws RemoteException; public double getPriceByTime(String time) throws RemoteException; 123456789101112131415161718192021 //服务端接口实现public class DynamicRemoteImpl extends UnicastRemoteObject implements DynamicRemote private static final long serialVersionUID = 1L; public DynamicRemoteImpl() throws RemoteException super(); @Override public double getNowPrice(String stock_code) RiseStocks stock=RiseQueue.unordered.get(stock_code); return stock.getPrice(); @Override public double getPriceByTime(String time) throws RemoteException System.out.println(time); return 0; 参考技术C 建议看一下高淇的Java300集,各方面的内容都讲的非常全面。

RMI学习笔记

java RMI(Remote Method Invocation)是一种基于java远程调用技术,是对RPC的java实现,可以在不同主机上进行通信与方法调用。PRC通信原理如图:

方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传 输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。 占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。 远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。

要完成以上步骤需要有以下几个步骤:
1、生成一个远程接口
2、实现远程对象(服务器端程序)
3、生成占位程序和骨干网(服务器端程序)
4、编写服务器程序
5、编写客户程序
6、注册远程对象
7、启动远程对象
具体实现代码如下:
远程接口定义:
 1 package com.corearchi.rmi.api;
 2 
 3 import java.rmi.Remote;
 4 import java.rmi.RemoteException;
 5 
 6 /**
 7  * 远程接口HelloService
 8  *
 9  * @author DonnieGao
10  * @create 2018-01-29 上午10:14
11  **/
12 public interface HelloService extends Remote {
13 
14     /**
15      * 远程接口方法sayHello
16      *
17      * @param somebody 某个人
18      * @return 返回调用接口结果
19      * @throws RemoteException 抛出RemoteException异常
20      */
21     String sayHello(String somebody) throws RemoteException;
22 }

远程接口实现:

package com.corearchi.rmi.impl;

import com.corearchi.rmi.api.HelloService;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/**
 * 远程接口HelloService的实现
 *
 * @author DonnieGao
 * @create 2018-01-29 上午10:18
 **/
public class HelloServiceImpl extends UnicastRemoteObject implements HelloService{

    /** 父类构造抛出异常,子类也需抛出异常 */
    public HelloServiceImpl() throws RemoteException {
    }

    /**
     * 远程接口方法sayHello
     *
     * @param somebody 某个人
     * @return 返回调用接口结果
     * @throws RemoteException 抛出RemoteException异常
     */
    @Override
    public String sayHello(String somebody) throws RemoteException {
        return "hello" + somebody;
    }
}

客户端Server实现:

 1 package com.corearchi.rmi.server;
 2 
 3 import com.corearchi.rmi.api.HelloService;
 4 import com.corearchi.rmi.impl.HelloServiceImpl;
 5 
 6 import java.net.MalformedURLException;
 7 import java.rmi.AlreadyBoundException;
 8 import java.rmi.Naming;
 9 import java.rmi.RemoteException;
10 import java.rmi.registry.LocateRegistry;
11 
12 /**
13  * 远程Rmi服务端
14  *
15  * @author DonnieGao
16  * @create 2018-01-29 上午10:25
17  **/
18 public class HelloServer {
19 
20     public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
21         // 创建远程服务接口
22         HelloService helloService = new HelloServiceImpl();
23 
24         // 注册服务
25         LocateRegistry.createRegistry(1234);
26         Naming.bind("rmi://localhost:1234/helloService",helloService);
27 
28         System.out.println("HelloServer has started and provide RPC service at the same time");
29     }
30 }
 1 package com.corearchi.rmi.client;
 2 
 3 import com.corearchi.rmi.api.HelloService;
 4 
 5 import java.net.MalformedURLException;
 6 import java.rmi.Naming;
 7 import java.rmi.NotBoundException;
 8 import java.rmi.RemoteException;
 9 
10 /**
11  * 远程连接的客户端
12  *
13  * @author DonnieGao
14  * @create 2018-01-29 上午10:29
15  **/
16 public class HelloClient {
17 
18     public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
19         // 引入远程服务
20         HelloService helloService = (HelloService) Naming.lookup("rmi://localhost:1234/helloService");
21 
22         // 调用远程方法
23         System.out.println("RMI服务器结果是 "+helloService.sayHello("Kitty"));
24     }
25 }

一个简单的RMI通信Demo就完成了,先运行Server,在运行Client。

以上是关于java RMI 如何返回远程对象的引用的主要内容,如果未能解决你的问题,请参考以下文章

Java学习笔记之RMI远程方法调用

远程方法调用(RMI)原理与示例

远程方法调用(RMI)原理与示例 (转)

RMI学习笔记

高级特性(11)- 分布式对象

Java中RMI远程调用demo