1manityの秘密基地 - 2022年9月25日
type: channel
link: https://1manity.top/index.php/2022/09/25/
description: 我能于万丈光芒中沉沦，一览最深邃的黑，也必能打破永夜，以骄傲的姿态重回！
items: Java安全小白的入门心得 - 初见RMI协议

Java安全小白的入门心得 - 初见RMI协议
type: item
date: 2022-09-25T19:31:00+08:00
description: RMI 学习心得RMI 协议的全称为 Remote Method Invocation （远程方法调用）协议。RMI 应用程序通常包含两个独立的程序，一个服务器和一个客户端。典型的服务器程序会创建一些远程对象，使对这些对象的引用可访问，并等待客户端调用这些对象上的方法。典型的客户端程序获取对服务器上一个或多个远程对象的远程引用，然后调用它们上的方法。RMI 提供了服务器和客户端通信和来回传递信息的机制。这样的应用程序有时被称为分布式对象应用程序。首先，实现一个最基本的RMI服务一个RMI由三部分组成RMI Registry RMI Server RMI Client其中，Registry的生成包含于RMI Server中。RMIServerimport java.rmi.Naming; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; public class RMIServer { public interface IRemoteHelloWorld extends Remote { public String hello() throws RemoteException; } public class RemoteHelloWorld extends UnicastRemoteObject implements IRemoteHelloWorld { protected RemoteHelloWorld() throws RemoteException { super(); } public String hello() throws RemoteException { System.out.println("call from"); return "Hello world"; } } private void start() throws Exception { RemoteHelloWorld h = new RemoteHelloWorld(); LocateRegistry.createRegistry(1099); Naming.rebind("rmi://127.0.0.1:1099/Hello", h); } public static void main(String[] args) throws Exception { new RMIServer().start(); } }⼀个RMI Server分为三部分：⼀个继承了 java.rmi.Remote 的接⼝，其中定义我们要远程调⽤的函数，⽐如这⾥的 hello()⼀个实现了此接⼝的类⼀个主类，⽤来创建Registry，并将上⾯的类实例化后绑定到⼀个地址。这就是我们所谓的Server了。RMIClientimport java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; public class TrainMain { public static void main(String[] args) throws Exception { RMIServer.IRemoteHelloWorld hello = (RMIServer.IRemoteHelloWorld) Naming.lookup("rmi://10.253.132.182:1099/Hello"); String ret = hello.hello(); System.out.println( ret); } }rmi协议，格式为： rmi://host:port/Object这里的host为127.0.0.1或者cmd命令行ipconfig命令中查询到的本机地址这里有一点小疑问，host使用上面两个，即192.168.220.1和192.168.83.1都可以达成同样的效果。这是VMware给本机建立的虚拟网卡，同样能够让rmi协议定位到本机。但是有一个比较奇怪的点，我打开wareshark抓包抓不到Client与Registry和Server的TCP与rmi包。只有在输错host时能够抓到tcp retransmission包修改host做了上述实验，先运行RMIServer，再运行RMIClient，这里我运行了3次，效果如下远程调用RMI测试相信刚刚接触到rmi的同学都会有…