RMI分布式通信及其应用

news/2024/10/13 17:10:51

分布式系统实验一

RMI分布式通信及其应用

实验名称:RMI分布式通信及其应用

实验要求:利用RMI通讯机制,完成一个分布式通讯应用。

实验学时:2学时。

实验内容:

设计一个基于Java RMI通讯机制的在线拍卖系统。系统客户端(买家)通过服务器(拍卖中心)出价竞拍商品,实现客户端和服务器之间的交互。

系统设计要求:

(1)服务器(拍卖中心):负责管理拍卖物品,记录出价和买家姓名,并通知所有注册的客户端当前的最高出价。

(2)客户端(买家):可以查看当前拍卖的物品名称和价格,然后输入买家姓名,进行出价。

代码结构:
1. Auction 接口

接口继承自 Remote,使得其方法可以从远程客户端调用。定义了拍卖相关的方法如placeBid和getCurrentBid。

2. AuctionImpl类
实现远程接口,继承自UnicastRemoteObject类,以确保其实例可以被远程访问。实现了placeBid和getCurrentBid方法,具体实现了拍卖功能。
3. AuctionServer类
包含main方法的服务器端程序。在该类中,需要创建AuctionImpl类的一个实例,并且启动RMI注册表,并将实例绑定到名为"Auction"的远程对象注册中。
4. AuctionClient类
包含main方法的客户端程序。在该类中,需要连接到RMI注册表,并获取"Auction"远程对象的存根(stub),然后通过命令行界面提供用户界面,使用户能够查看物品的当前出价并进行出价操作。
运行结果:

启动服务端:

启动客户端:

在一个客户端发起出价,另一个客户端查询。


轮流出价,查询。

遇到的问题:

在IntelliJ IDEA中运行测试,需要运行多个Client端实例,再次点击运行后会提示“是否重新运行”。
解决:将如下设置打开,就可以运行多个Client端实例。


RMI:

RMI(Remote Method Invocation)远程方法调用,Java RMI 在 JDK1.1 中实现, 支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的 无缝远程调用,是网络分布式应用系统的核心解决方案之一。

RMI 目前使用 Java 远程消息交换协议 JRMP(Java Remote Messaging Protocol) 进行通信。用 Java RMI 开发的应用系统可以部署在任何支持 JRE(Java Run Environment Java,运行环境)的平台上。但由于 JRMP 是专为 Java 对象制定的, 因此,RMI 对于用非 Java 语言开发的应用系统的支持不足,不能与用非 Java 语 言书写的对象进行通信。

提示:

一、实验中的应用案例

1. 逻辑关系

首先有一个共同的协议(即远程接口),然后实现这个接口,然后在服务端 注册这个实现的实例,最后客户端才能找到并使用这些远程对象。在整个过程中, 接口作为客户端和服务端之间的合同,保证了双方可以通过预定的方式进行有效 的通信。

2. 实现步骤

以在线拍卖应用为例,部分代码提示如下,

(1)接口定义:定义了必要的远程接口,接口继承自 Remote,使得其方法 可以从远程客户端调用。

package com.hit.java.auction;
import java.rmi.Remote;
import java.rmi.RemoteException; //定义一个 Auction 接口,该接口包括方法来出价和获取当前最高出价

public interface Auction extends Remote {boolean placeBid(String itemID, double bid, String bidderName) throws RemoteException;String getCurrentBid(String itemID) throws RemoteException; }

 

(2)实现远程接口 AuctionImpl 类:实现了 Auction 接口的类 AuctionImpl, 此类继承自 UnicastRemoteObject,使得其实例可以被远程访问。内部使用两个 哈希图分别存储当前的最高出价和相应的出价者。

package com.hit.java. auction;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
import java.util.HashMap; import java.util.Map; //实现 Auction 接口。该实现将保存当前的最高出价并通知所有注册的客户端。public class AuctionImpl extends UnicastRemoteObject implements Auction {private Map currentBids;private Map highestBidder;protected AuctionImpl() throws RemoteException {super(); currentBids = new HashMap<>();highestBidder = new HashMap<>();}@Overridepublic synchronized boolean placeBid(String itemID, double bid, String bidderName) throws RemoteException {如果提供的出价高于当前记录的最高出价,则更新记录,并返回 true;否则返回 false;}@Overridepublic synchronized String getCurrentBid(String itemID) throws RemoteException {返回指定物品的最高出价及出价者信息;}
}

 

(3)AuctionServer 类。创建包含 main 方法的服务器端程序,创建 AuctionImpl 的一个实例,然后创建设置并启动了 RMI 注册表。负责创建和注册 RMI 服务,使其能够接受客户端的远程调用。

package com.hit.java.auction;import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry; //服务器程序将创建和注册远程对象。

public class AuctionServer {public static void main(String[] args) {创建 AuctionImpl 实例; 启动 RMI 注册表; 该实例绑定到名为 "Auction" 的远程对象注册中; 打印服务器状态;}
}

 

(4)AuctionClient 类。开发包含 main 方法的客户端程序。允许用户与远程 拍卖服务进行交互,提交出价或查询当前出价。

package com.hit.java.auction;import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Scanner; //客户端程序将允许用户查看当前的最高出价和进行出价。

public class AuctionClient {public static void main(String[] args) {连接到 RMI 注册表,与服务端建立连接;查找并获取 "Auction" 远程对象的存根(stub);通过命令行界面,提供用户界面,用户可以查看物品的当前出价并进行出价操作;}
}

 

程序先启动服务端,然后启动客户端。整个系统通过这四部分协同工作,实 现了一个分布式的远程系统。这个示例只有一个客户端,如果想查看多客户端的 RMI 通信过程,需要建立多个虚拟机作为客户端

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71129.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

windows下安装部署 hadoop

一、安装下载 1.首先在hadoop官网下载一个稳定版本,选择binary包 官网地址:https://hadoop.apache.org/releases.html 下载下来是tar.gz文件,用winrar解压即可。 2.因为这个压缩包是for linux系统的,win下还需要安装几个dll winutils, 下载地址:https://www.jianguoyun.c…

软件工程实验:结对编程与Git实战

Lab 1实验报告 实验要求 1 .读入文本并生成有向图: 将文本数据转换为有向图结构,各单词作为节点,有向边表示单词在文本中的相邻关系及其出现次数。 2. 展示有向图: 图形化展示生成的有向图,并可保存为图形文件。 3. 查询桥接词: 查询两个单词之间的桥接词,即图中存在两条…

【Ubuntu】“Linux版PhotoShop”绘图软件的安装和汉化

【Ubuntu】“Linux版PhotoShop”绘图软件的安装和汉化 零、前言 最近换了Linux系统,但是写教程做PPT的时候还是得用到绘图软件,上网一查,总结对比之后发现Krita比较好用,故此讲解一下如何安装和汉化Krita。 壹、安装 安装很简单,按快捷键Ctrl+Alt+T,打开bash,输入如下命…

The 1st Universal Cup. Stage 22: Shaanxi

Preface 时隔一周之后难得开了场训练,然后犯了一堆弱智错误给自己搞红温了,最后感觉啥难题也没写就混着混着就结束了 赛后想补题经典找不到题解,只搜到哥哥的题解结果搞不懂细节还是写不来一点,直接开摆D. Alice and Bob 首先博弈部分的结论很好猜,若第一次操作开头的数为…

cookie 和 session

1、cookie 通过在客户端记录的信息确定用户身份。 http是一种无连接协议,客户端和服务端交互仅限于请求/响应过程,结束后断开,下一次请求时,服务端会认为是一个新的客户端。 为了维护连接,让服务端知道这是前一个用户发起的请求,必须在一个地方保存客户端信息。 2、sessi…

2024-2025-1 20241318 《计算机基础与程序设计》第三周工作总结

这个作业属于哪个课程 <(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)>(如[2024-2025-1-计算机基础与程序设计]这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK03这个作业的目标 数字分类与计数法位置计数法进制转换模拟数据与数字…

Qt/C++开源控件 圆形进度条

Qt/C++开源控件 圆形进度条简约风格: 设计简洁,没有多余的元素,清晰地显示了当前进度。 颜色对比: 使用了亮色的蓝色来标示进度,与深色背景形成鲜明对比,使得进度指示一目了然。 清晰的刻度: 刻度线清晰,尽管没有标注所有数字,但通过较长的刻度线在50和100的位置,用户可…

GIC V3中断

GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器,其architecture specification目前有四个版本,V1~V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64服务器系统结构)。目前在ARM官方网站只能下载到Version 2的GIC architecture…