RMI使用手记

关于 RMI RMI 是 Java 跨 JVM 远程方法调用技术,核心风险为反序列化漏洞、未授权访问及通信未加密;防护需重点落实 SSL 加密、身份认证,同时避免 Java 原生序列化并限制服务暴露范围。 阅读详情
 我现在的编程方法,不再是以前的整块应用,和C/S应用的两层架构,现在流行的编程方式是三层架构,就是表示层,商业逻辑,还有数据库都相互独立。
    远程方法调用正是基于三层架构设计的中间层。远程方法调用的原理是桩和骨架结构。主要有三层,分别是桩/骨架层,远程引用层,还有传输层。
    要完成一个简单的RMI应用要分为以下几个简单的步骤:
    1。定义远程接口
    2。定义和实现RMI服务器类
    3。定义和实现客户端类
    4。编译以上的源码
    5。生成桩/骨架
    6。创建安全策略
    7。启动RMI注册表
    8。启动服务器
    9。启动客户端
 
我们来做一个例子,在服务器上有一个连接数据库,插入值的方法,我们在客户端要使用这个方法,来真正的插入一个值!
    第一步:先编写一个接口AccountServer.java,这个接口要继承Remote接口,并且提供一个远程方法insertDetails(),这个方法要抛出RemoteException异常,代码如下:

    import java.rmi.Remote;
import java.rmi.RemoteException;

public interface AccountServer extends Remote
{
    public String insertDetails(String firstName, String lastName,
            String phone, String income, String accountType)
            throws RemoteException;
}

    第二步:实现远程对象类,就是RMI服务器,AccountServerImpl.java,这个类要继承UnicastRemoteObject类,并且要实现自己写的远程接口类AccountServer,首先要定义远程对象构造器,然后就是要实现远程接口中的方法,这个方法来连接mysql数据库,并且插入值.然后我们main方法中,设置安全管理程序,然后创建远程对象,接着注册远程对象.代码如下:

import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class AccountServerImpl extends UnicastRemoteObject implements
        AccountServer
{
    private Connection con;

    public AccountServerImpl() throws RemoteException
    {
        super();
    }

    public String insertDetails(String firstName, String lastName,
            String phone, String income, String accountType)
            throws RemoteException
    {
        int rowsAffected = 0;
        String sReturn = "fail";
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager
                    .getConnection(
                            "jdbc:mysql://127.0.0.1/jsptest?useUnicode=true&characterEncoding=GBK",
                            "root", "");
            PreparedStatement ps = con
                    .prepareStatement("insert into User_info values(?,?,?,?,?)");
            ps.setString(1, "firstName");
            ps.setString(2, "lastName");
            ps.setString(3, "phone");
            ps.setString(4, "income");
            ps.setString(5, "accountType");

            rowsAffected = ps.executeUpdate();

            if (rowsAffected > 0)
            {
                sReturn = "success";
            }

        }
        catch (Exception e)
        {
            e.printStackTrace();           
        }
        return sReturn;
    }

    public static void main(String[] args)
    {
 //设置安全管理程序
        System.setSecurityManager(new RMISecurityManager());

        try
        {
     //创建远程对象
            AccountServerImpl as = new AccountServerImpl();
            //注册远程对象
            Naming.rebind("AccountServer", as);
            System.out.println("RMI服务器启动成功");
        }
        catch (RemoteException e)
        {
            e.printStackTrace();
        }
        catch (Exception e1)
        {
            e1.printStackTrace();
        }
    }

}
       第三步:编写客户端代码,Client.java 这个代码中有两个重要的任务,就是得到远程对象的应用,然后调用远程对象,其余的都是界面部分,就不再讲解,代码如下:

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.Naming;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Client
{
    public static void main(String[] args)
    {
        ClientFrame frame = new ClientFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.show();
    }
}

class ClientFrame extends JFrame
{
    public ClientFrame()
    {
        setTitle("客户端");
        setSize(200, 220);

        Container con = getContentPane();
        ClientPanel panel = new ClientPanel();
        con.add(panel);
    }
}

class ClientPanel extends JPanel
{
    private JLabel lfirst, llast, lphone, lincome, ltype;

    private JTextField ffirst, flast, fphone, fincome, ftype;

    private JButton submit;

    public ClientPanel()
    {
        lfirst = new JLabel("   姓:");
        llast = new JLabel("   名:");
        lphone = new JLabel("电话:");
        lincome = new JLabel("来自:");
        ltype = new JLabel("类型:");

        ffirst = new JTextField(10);
        flast = new JTextField(10);
        fphone = new JTextField(10);
        fincome = new JTextField(10);
        ftype = new JTextField(10);

        submit = new JButton(" 提  交 ");
        submit.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    //得到远程对象
                    AccountServer as = (AccountServer) Naming
                            .lookup("rmi://localhost/AccountServer");
                    String firstName = ffirst.getText();
                    String lastName = flast.getText();
                    String phone = fphone.getText();
                    String income = fincome.getText();
                    String accountType = ftype.getText();
             //调用远程方法
                    String str = as.insertDetails(firstName, lastName, phone,
                            income, accountType);
                    if ("fail".equals(str))
                    {
                        JOptionPane.showMessageDialog(null, "插入失败");
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null, "插入成功");
                    }

                }
                catch (Exception e2)
                {
                    e2.printStackTrace();
                }
            }
        });

        add(lfirst);
        add(ffirst);
        add(llast);
        add(flast);
        add(lphone);
        add(fphone);
        add(lincome);
        add(fincome);
        add(ltype);
        add(ftype);
        add(submit);
    }
}

       第四步:在Dos下,进入代码所在目录,使用javac *.java 来编译所有代码
       第五步:在class文件所在目录使用 rmic AccountServerImpl来生成桩和骨架(AccountServerImpl_Skel.class和AccountServerImpl.Stub.class)
       第六步:用policytool工具来创建安全策略文件,放开所有的权限,保存.java.policy文件在C:/Documents and Settings/Administrator文件夹下
       第七步:使用start rmiregistry命令来启动注册表,默认使用1099端口,我们不需要改变
       第八步:java -Djava.rmi.server.codebase=file:/e:/aa/ -classpath .;%CLASSPATH% AccountServerImpl来启动服务器,注意由于服务器中要使用Mysql数据库,所有我们引入使用数据库的jar包,将mysql的jar包添加的CLASSPATH,就OK呢
       第九步:使用java Client来启动客户端,和得到图形界面的客户端,填入数据,点击提交,数据就会添加进入数据库

附:
数据库名称:jsptest
表名:user_info
表结构:
CREATE TABLE user_info (
  firstName varchar(50) NOT NULL default '',
  lastName varchar(50) NOT NULL default '',
  phone varchar(20) NOT NULL default '',
  income varchar(30) NOT NULL default '',
  accountType varchar(50) NOT NULL default '',
  PRIMARY KEY  (firstName)
)

 
OpenClaw小白使用全攻略 OpenClaw全能技能解锁指南:从基础到进阶 摘要: 本文提供OpenClaw AI智能体的完整使用教程,帮助用户从安装后"不知道如何用"到熟练掌握核心功能。教程包含:1)控制台5大区域详解和3个必做初始化设置;2)文件管理、浏览器自动化、文档生成等5大基础功能实操,每个功能配有详细操作步骤、指令模板和效果演示;3)10+高频场景解决方案,如整理文件、搜集资料、写总结等;4)进阶技巧和常见问题解答。通过清晰的图文指引,即使电脑小白也能快速上手,实现办公自动化、提升工作效率。 阅读详情

相关推荐

Anomalib实战:从零开始构建自定义数据集的异常检测模型

本文详细介绍了如何使用Anomalib 2.1.0从零开始构建自定义数据集的异常检测模型。通过实战演示,指导读者准备符合规范的数据集结构,快速上手训练Patchcore等先进算法,并完成模型推理与调优,为工业质检、医疗影像等场景提供高效的视觉异常检测解决方案。

weixin_29165465的博客 109

什么是RMI,为什么要使用RMI框架?

这里是修真院后端小课堂,每篇分享文从 八个方面深度解析后端知识/技能,本篇分享的是: 【什么是RMI,为什么要使用RMI框架?】 大家好,我是IT修真院深圳分院第10期的JAVA学员,一枚正直纯洁善良的java程序员。 今天给大家分享一下,修真院官网Java任务8,深度思考中的知识点—什么是RMI,为什么要使用RMI框架? 1.背景介绍 什么是RMI RMI是Java的一组拥护开发分布式应用程序的...

learning__java的博客 1万+

STM32F103 超声波风速风向仪实战:0.1m/s精度风洞标定与OLED显示(附源码)

本文详细介绍了基于STM32F103的超声波风速风向仪设计与实现,通过超声波时间差测量技术实现0.1m/s高精度测量。文章涵盖硬件设计、算法实现、风洞标定及OLED显示等关键环节,提供完整源码,适用于气象监测、风力发电等领域。

weixin_42532938的博客 275

RMI介绍

      其实我近日有想法要请总坛主开设Java分布式应用版块,专门讨论Java分布式应用。如Jini,CORBA,RMI,RMI-IIOP等。更进一步,还包括各种技术之间的通讯等问题。比如RMI-IIOP和CORBA通讯,Jini访问CORBA对象,EJB到CORBA映射等高级问题。不过暂时还没有实现。所以姑且在此先讨论一下这些东西好了。RMI是Sun基于Java技术推出的一种分布式应用方案。

天高任鸟飞,海阔凭鱼跃 2751

ZYNQ平台上基于SGMII接口的IEEE1588/PTP协议高效实现方案

本文深入探讨了在Xilinx ZYNQ平台上,利用SGMII接口实现高精度IEEE1588/PTP协议的方案。通过将硬件时间戳单元集成在PL端的AXI以太网子系统IP核中,该方案绕过了软件协议栈和外部PHY的延迟,实现了亚微秒级的时间同步精度。文章详细解析了硬件设计、Vivado IP配置、Linux驱动移植及PTP协议栈部署等关键步骤,为工业控制、通信等领域的高精度网络同步提供了高效、灵活的解决路径。

q5r6s7的博客 604

Labwindows CVI写上位机与STM32下位机通信(二)

接着上篇,这篇主要谈谈流量计数据读取。我们使用的MEMS流量计采用Modbus协议Modbus 使用RS-485 作为硬件载体。 一. Modbus协议   该协议定义了 Modbus 总线Master(主设备)与Slave(从设备)之间的通讯报文格式,对于主设备来说,Modbus 协议是联系上位机(如PC、PLC、HMI 等)的接口,而且所有的通讯都是“透明的”。控制器通信使用主-从技术,即

yang2011079080010的专栏 1万+

java rmi

Java RMI(Remote Method Invocation,远程方法调用)是 Java 提供的一种用于实现分布式计算的机制,允许一个 Java 虚拟机中的对象调用另一个 Java 虚拟机中对象的方法。RMI 是 Java 早期的分布式技术之一,虽然在现代开发中逐渐被其他框架(如 gRPC、Spring Remoting 等)所替代,但它仍然是一个非常重要的技术,值得深入学习。远程对象是 RMI 的核心,它是一个实现了 接口的类的实例。远程对象的方法可以通过网络被其他 JVM 调用。远程接口是一个定

qq_62784677的博客 1142

提高RFID检测距离以及检测速度的方法总结

摘要:提高RFID检测距离需优化阅读器功率、标签灵敏度、天线设计及频段选择,同时减少环境干扰;提升检测速度则需改进防碰撞算法、增强并行处理能力、精简数据传输。实际应用需平衡两者关系,如物流仓储采用UHF频段、高增益天线和动态Q算法实现远距离高速读取,ETC系统则通过微波频段和高速调制实现超远距离快速识别。不同场景需针对性优化硬件配置和系统参数。

start_up_go的博客 292

RMI 深入探究

前面我们学习了RMI的一些基本知识,本节我们将深入理解RMI应用的基本架构并在此基础上构建自己的RMI应用程序。

java_lover20111106的博客 1044

海思3403烧结、复用及mic输入

3403调试的第一步是版本烧结,版本烧结经常遇到问题,本文记录总结遇到的各种问题。

平面到立体 1355

如何修改网页中的文本内容改成自己希望的数值?

本篇文章主要讲解,通过浏览器命令和浏览器自带的F12开发者工具,进行修改网页内容的方法教程 日期:2021年12月5日 作者:任聪聪 一、通过F12开发者工具进行修改 进入方式汇总: 1.右击鼠标,显示菜单找到审查 2.通过快捷键F12进入,笔记本需要先关闭fnlk功能键。 开发者工具介绍 说明: 1.表示选择元素,点击后可以选择文本的元素所在地 2.表示显示方式,手机还是电脑 3.表示div元素,点击后可以展开,对div内的html和文本进行编辑。 双击文本,即可进行修改成自己想要的,但是刷新后.

任聪聪的博客 2万+

什么是RMI

大家好,我是IT修真院武汉分院第15期的学员,一枚正直纯洁善良的JAVA程序员。今天给大家分享一下,修真院官网JAVA任务8的知识点——什么是RMI 1.背景介绍 2.知识剖析 3.常见问题 4.编码实战 5.扩展思考 6.参考文献 7.更多讨论   1.背景介绍 RMI全称是Remote Method Invocation-远程方法调用,是纯Java的网络分布式应用系统的核心...

qq_42218123的博客 4011

【博文汇总】I2C总线学习

将这一周学习I2C总线的文章汇总一下。 基础知识学习 触发器的建立时间和保持时间 如何学习总线技术 TTL电平和CMOS电平 深入理解 关于I2C和SPI总线协议 I2C总线深入浅出 I2C总线信号时序总结 对I2C总线协议的一些理解 对I2C总线的时钟同步和总线仲裁的深入理解 I2C总线学习终结,开始SPI总线的学习 深入理解IIC总线时序

ce123的技术博客 6215

Eclipse中RMI的实现

       现在Eclipse使用的比较多,而其功能的可扩展性也是超级强大,可以将多种工具和开发技术通过插件包的形式融合进来。这里说一下怎么通过RMI Plugin在Eclipse里面调试RMI程序。 一、准备安装包       Eclipse的下载地址这里就不说了,可以参考我的blog中《Eclipse开发struts指南》一文。这里提供RMI Plugin for Eclip

火凤长鸣 8035

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

RMI简介

RMI (Remote Method Invocation) 模型是一种分布式对象应用,使用 RMI 技术可以使一个 JVM 中的对象,调用另一个 JVM 中的对象方法并获取调用结果。这里的另一个 JVM 可以在同一台计算机也可以是远程计算机。因此,RMI 意味着需要一个 Server 端和一个 Client 端。

射手座的程序媛的专栏 1283

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

RMI与RMI-IIOP区别

   什么是RMI   分布式计算系统要求运行在不同地址空间不同主机上的对象互相调用。各种分布式系统都有自己的调用协议,如CORBA的IIOP(Internet InterORB Protocol), MTS的DCOM。那么EJB组件呢?在Java里提供了完整的sockets通讯接口,但sockets要求客户端和服务端必须进行应用级协议的编码交换数据,采用sockets是非常麻烦的。   一个代替

技术收藏 3478

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

什么是rmi?为什么要使用rmi框架?

大家好,我是IT修真院武汉分院第13期的学员石奥林,一枚正直纯洁善良的JAVA程序员。今天给大家分享一下,修真院官网JAVA任务8的知识点——Spring RMI   Java小课堂 1.背景介绍 2.知识剖析 3.常见问题 4.解决方案 5.编码实战 6.扩展思考 7.参考文献 8.更多讨论 1.背景介绍 RMI全称是Remote Method Invocation-远程...

qq_26892215的博客 1592

RMI 基础

这篇文章讲述Java2 平台中远程方法调用(RMI)技术的基础。简介:使用RMI进行分布式计算RMI(Remote Method Invocation,远程方法调用),在JDK1.1中被首次引入,它将网络编程提升到一个更高的层面。尽管相对来说,RMI比较易用,它仍然是一个引人注目的强大技术。它为普通的java开发者揭开了一个全新的角度——分布式对象计算的世界。这篇文章将对这个通用的技术作一个深度的介绍。RMI技术被认为形成于JDK1.1,在Java 2 SDK中得到显著提升。在应用时,RMI在这两个版本

Hufei的专栏 1754

RMI是什么

RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI是非常容易使用的,但是它非常的强大。   RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义

从最底层做起的人 1万+

PRC之RMI:RMI原理详解

定义 RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。 Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使J.

简单的坚持的专栏 1646

rmi的执行流程

定义并实现远程接口。服务器创建远程对象并注册到RMI注册表。客户端通过注册表查找远程对象。客户端调用方法,通过Stub和网络传输到服务器。服务器执行方法并返回结果给客户端。RMI虽然简单易用,但由于性能和复杂性问题,现代分布式系统更多使用RPC框架(如gRPC)或RESTful API。如果你有具体问题或想深入某部分,可以告诉我!

qq_63553317的博客 940

【java安全】RMI

RMI远程方法调用,是java独立的一种机制。RMI的作用就是在一个java虚拟机调用另一个java虚拟机上对象的方法在网络传输的过程中,RMI中对象是通过序列化的形式进行编码传输,既然有序列化,必然会有反序列化,RMI服务端在接收到序列化后的会将对象进行反序列化。在反序列化攻击中,我们可能找不到反序列化的点,那么使用RMI就可以作为反序列化利用链的触发点 *****

leekos的博客,分享web安全相关知识~ 1564
上一篇: 使用tomcat4.1.31和mysql 配置数据源
squall___3
博客等级 码龄21年 1粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值