服务端网络通信RMI

在这里插入图片描述

服务端网络通信 RMI

一、摘要

RMI( Remote Method Invocation),远程方法访问。在做C/S开发中,让我们可以不必关心底层网络通讯细节,也可像调用本地对象方法一样调用远端对象方法,方便了业务流程。

在这里插入图片描述

从上述图片可以看出RMI在端对端通信的处理方式 客户端请求——>服务端响应处理——>客户端回调处理。

业务场景例子:用户请求另一个离线用户的信息,此时服务端global的用户信息没有该用户,这个时候我们就需要到数据库查询该离线用户信息,数据库返回信息。在此应用场景中,我们会在服务器A(数据库的服务器)上定义业务需要的查询数据方法例如GetUserInfo,GetUserName等等数据库查询方法,我们需要在服务器B(业务处理的服务器)上调取数据库定义的查询接口 并将获得的数据返回。但是服务器B并不能直接调服务器A的方法,那么我们该怎么搞呢?

​ RMI就是干这件事的工具,我们先建立服务器A查询方法调用的映射表,约定通信编码格式,服务器B通过RMI通信携带的方法名和CallBackObject,调用了服务器A的查询方法,并将查询所需的信息存到了CallBackObject,服务端B在CallBackObject时做相应的业务处理。

二、基本业务流程

在这里插入图片描述

1、method_list 初始化

​ 服务器在初始化时会创建相应业务的RMIObject模块 例如Login、User、System等等,并将相应的RMI服务按照名字和地址绑定到对象管理器。

2、CreateRMISession

​ 客户端和服务器建立socket网络链接,创建客户端session并关联到session_list(通信结算之后session会被释放)

3、OnRecvPackage

​ 建立连接之后,开始正式rmi通信,客户端将参数对象序列化后,发起服务请求

4、RecvRMICallHelper

​ 服务端反序列化获取参数对象,查找对应模块,调用rmi服务函数

5、rmisession Return

​ 将处理结果序列化,发送客户端

6、OnRecvPackge

​ 客户端反序列化,通过id查找 对应backobj处理结果

整个业务流程:RmiModule(客户)->Session(客户)->NetWork->Session(服务)->RmiModule(服务)–>RmiModule(客户)->Session(服务)->RmiModule(服务)–>RmiModule(客户)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RMI(Remote Method Invocation) 是 Java 中的一种远程方法调用机制,它允许在分布式系统中通过网络访问远程对象,使得程序员可以像调用本地对象一样调用远程对象的方法。下面我将为您提供一个简单的 RMI 客户端和服务端开发实例。 1. 编写服务端代码 首先,我们需要编写一个服务端 Java 类,该类需要实现一个远程接口。在该接口中,我们定义了一个 `getMessage` 方法,用于返回一个字符串信息。 ```java import java.rmi.Remote; import java.rmi.RemoteException; public interface Message extends Remote { public String getMessage() throws RemoteException; } ``` 接着,在服务端代码中,我们需要实现这个接口,提供相应的实现逻辑。在这个例子中,我们简单地返回了一个字符串信息。 ```java import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class MessageImpl extends UnicastRemoteObject implements Message { public MessageImpl() throws RemoteException { super(); } public String getMessage() throws RemoteException { return "Hello, RMI!"; } } ``` 2. 启动 RMI 服务服务端代码中,我们需要启动一个 RMI 服务,使得客户端可以通过网络访问到远程对象。在这个例子中,我们使用 `LocateRegistry.createRegistry` 方法创建了一个 RMI 注册表,并在该注册表中绑定了一个名为 "Message" 的远程对象。 ```java import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class Server { public static void main(String args[]) { try { MessageImpl obj = new MessageImpl(); Registry registry = LocateRegistry.createRegistry(1099); registry.rebind("Message", obj); System.out.println("Server started."); } catch (Exception e) { System.out.println("Server exception: " + e.getMessage()); e.printStackTrace(); } } } ``` 3. 编写客户端代码 在客户端代码中,我们需要通过 RMI 注册表查找远程对象,并调用其方法。在这个例子中,我们查找了名为 "Message" 的远程对象,并调用了其 `getMessage` 方法。 ```java import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class Client { public static void main(String args[]) { try { Registry registry = LocateRegistry.getRegistry("localhost"); Message stub = (Message) registry.lookup("Message"); String response = stub.getMessage(); System.out.println("Response: " + response); } catch (Exception e) { System.out.println("Client exception: " + e.getMessage()); e.printStackTrace(); } } } ``` 4. 运行程序 最后,我们需要在命令行中依次运行服务端程序和客户端程序,以启动 RMI 服务并访问远程对象。 ``` # 启动服务端 $ java Server # 启动客户端 $ java Client ``` 输出结果为: ``` Server started. Response: Hello, RMI! ``` 以上就是一个简单的 RMI 客户端和服务端开发实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值