RMI执行过程分析

简介: 客户端代码public class RMIClient { public static void main(String... args) throws RemoteException, NotBoundException, MalformedURLException { if (args == null || args.length 网络传输–>反序列化 的过程上面提到的marshal 和 unmarshal的意思,其实就是 serialize和 unserialize的意思。

客户端代码

public class RMIClient {
    public static void main(String... args) throws RemoteException, NotBoundException, MalformedURLException {
        if (args == null || args.length <= 1) {
            System.out.println("usage : java -jar RMIClient.jar rmi_server_ip content");
            System.exit(0);
        }
        IRMIService service = (IRMIService) Naming.lookup("rmi://"+args[0]+":1099/RMIServer");
        System.out.println(service.speakToYourself(args[1]));
        //speakToYourself 这个方法仅仅就是在输入参数前面加上了另外一个字符串而已,然后返回。
    }
}

抓包结果

上述代码执行过程中,使用wireshark进行抓包,得到如下结果
这里写图片描述

抓包结果分析:
48-49 :tcp的三次握手
54-69 :通信数据
70-72 :断开连接

54-69中协议类型凡是tcp的,都是确认其他数据包的确认包,比如55号:
这里写图片描述

其他为rmi协议的才包含通信数据。

矛盾

oracle文档中介绍rmi的背景时说:
截图
这里写图片描述

 socket要求client和server参与到应用层协议,以便对交换的信息进行编码和解码。这种协议的制定就是笨重的和容易出错的。
 官方连接:https://docs.oracle.com/javase/8/docs/platform/rmi/spec/rmi-intro2.html

但是跟踪rmi源码可以知道,rmi同样时通过socket来通信的。所以这让人感觉有点矛盾。。

源码截图

这里写图片描述

Connection封装

通过socket拿到Connection后,rmi对conn进行了tcpconnection的封装

这里写图片描述

写入rmi协议头部信息

这里写图片描述

对照抓取到的包信息:

这里写图片描述

两者是符合的。

原理分析

rmi底层采用了Stub 和 Skeletons机制。。
Skeletons:运行在server端,负责分发请求。接到client端的请求后,会做三件事:

  1. unmarshals 客户端发送来的数据
  2. 根据收到的数据,执行相关的方法,拿到执行结果
  3. marshals执行结果,发送给client

Stub:运行在client端,需要调用远程方法时,会做下面几件事(基本和skeleton反着来)

  1. marshals待发送数据并发送
  2. 等待结果
  3. unmarshals收到的数据

个人认为那个skeletons就有点类似于spring的dispatcherservlet,当收到客户端请求后,负责把请求分发到相应的controller进行处理。

针对上面给出的客户端代码,客户端发送的数据就是 :

"rmi://"+args[0]+":1099/RMIServer"

接收到的结果就是:

IRMIService service  //这样一个实例

注意

拿到 IRMIService service 这样一个实例后,当调用service的 service.speakToYourself(args[1])方法时,并没有与服务器通信。
也就是说这个方法的执行是在本地执行,而非在远程服务器上执行后再回传结果
注意,是 本地执行

那么rmi说的远程调用,怎么体现远程呢?
这个远程调用指的是,客户端发送”rmi://”+args[0]+”:1099/RMIServer”到获取service实例的过程,这个是在远程服务器上执行的。

本质

跟踪代码执行过程可以知道,从客户端发送数据,到拿到service实例的过程,其实就是
对象的序列号–>网络传输–>反序列化 的过程

上面提到的marshal 和 unmarshal的意思,其实就是 serialize和 unserialize的意思。这个可以查证wiki:https://en.wikipedia.org/wiki/Marshalling_(computer_science) ,在代码上也的确是这么回事。

底层采用的IO模型

查看源码可以知道,现在的rmi实现采用的io是bio,并没有采用jdk1.4提供的nio功能。看截图:
这里写图片描述

这里写图片描述

这里写图片描述

PS:我使用的jdk是1.8版本的

JDK8版本及以前版本,RMI采用的IO模型是 BIO

其他

补充阅读:https://www.ietf.org/rfc/rfc2713.txt rmi协议rfc文档

查看tcp报文段首部的格式,发现并没有一个标示来标示tcp上层采用的是什么协议,所以凡是需要用到在tcp协议之上的协议时,都需要自己来处理获取到的数据,自己根据需要按照某种协议格式进行处理数据。
(PS:IP数据报首部是有这样的8bit的空间来标示上一层协议是什么协议)

也就是说当我们拿到通过tcp层传上来的数据时,需要我们自己按照某种协议的格式去处理数据

好比上面rmi协议,可以发现发送数据的时候,是程序自己完成写rmi首部字段工作的。

所以使用http协议时,也需要自己完成 写首部,收到数据后分析处理首部等工作。既然如此,可以验证下tomcat在处理请求的时候,是不是这样子处理收到的数据和发送数据的?

目录
相关文章
|
6天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
3138 10
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
14天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
3498 12
|
17天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
3594 25
|
10天前
|
人工智能 Linux BI
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
JeecgBoot AI专题研究 一键脚本:Claude Code + JeecgBoot Skills + DeepSeek 全平台接入 一行命令装好 Claude Code + JeecgBoot Skills + DeepSeek 接入,无需翻墙使用 Claude Code,支持 Wind
2796 6
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
|
8天前
|
人工智能 自然语言处理 供应链
|
8天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全+三种模式+记忆体系+实战工作流完整手册
Claude Code 是当前最流行的终端级 AI 编程助手,能够直接在命令行中完成代码生成、项目理解、文件修改、命令执行、错误修复等全流程开发工作。它不依赖图形界面、不占用额外资源,却能深度理解项目结构,自动生成规范代码,大幅提升研发效率。
1319 3
|
29天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23613 15
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
1天前
|
人工智能 缓存 自然语言处理
阿里Qwen3.7-Max评测:Agent能力显著提升,耗时与调用成本大幅下降
阿里云百炼推出面向智能体的旗舰大模型Qwen3.7-Max,具备长周期自主执行能力,显著提升编程、办公自动化等复杂任务处理水平;支持MCP集成与多框架兼容,并以限时5折+100万Tokens免费试用大幅降低使用门槛,助力企业高效落地AI应用。在阿里云百炼平台快速体验:https://t.aliyun.com/U/fPVHqY