🏹Java学习之RMI远程调用

在学习序列化的时候发现了一个东西叫RMI,来学习一下 概念 远程调用 RMI(Remtoe Method Invocation) 顾名思义就是本地JVM通过网络远程调用另一个JVM上的某个方法。采用客户端/服务器通信方式(C/S)。需要在服务器上部署提供服务的远程对象,然后在客户端请求访问服务器上远程对象的方法。 RMI框架采用代理(Proxy)来负责客户端和服务端之间通信的细节。RMI框架分别生成了客户端代理和服务端代理。位于客户端的代理被称为存根(Stub),位于服务端的代理类被称为骨架(Skeleton)。 存根(Stub): 客户端调用远程对象时,实际上是通过本地代理对象(Stub)来进行的。Stub负责将方法调用转发到远程对象。 骨架(Skeleton): 位于服务端的代理对象,用于接受来自客户端的请求,并将请求转发给实际的远程对象。 使用流程 1.创建远程接口 远程接口,需要直接或者间接的继承Remote(java.rmi.Remote)接口,远程接口声明了可以被客户端访问的远程方法。而且接口中的方法都要抛出RemoteException(java.rmi.RemoteException)异常。 这里实现了一个求和方法。 import java.rmi.Remote; import java.rmi.RemoteException; interface HelloServer extends Remote { public int Sum(int a,int b) throws RemoteException; } 2.创建远程类 远程类用于实现远程接口。为了使远程类的实例能够提供服务,还需要把它导出为远程对象。有下面两种途径: 子类化UnicastRemoteObject import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; class HelloServerImpl extends UnicastRemoteObject implements HelloServer{ //远程类的构构方法必声明抛出RemoteException异常 public HelloServerImpl() throws RemoteException{ } @Override public int Sum(int a, int b) throws RemoteException { return a+b; } } 调用exportObject方法(如果远程类已经继承了其他类,无法继承UnicastRemoteObject。) import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; class HelloServerImpl [extends OtherClass] implements HelloServer{ public HelloServerImpl() throws RemoteException { //端口0代表监听任意一个匿名端口 UnicastRemoteObject.exportObject(this, 0); } @Override public int Sum(int a, int b) throws RemoteException { return a+b; } } 3.创建服务器程序 RMI有一个注册表,注册表将一个名称映射到远程对象。 服务器使用注册表注册其远程对象,以便可以查找它们。 客户端想要调用远程对象上的方法时,它必须首先使用其名称查找远程对象。 ...

June 13, 2024 · 2 min · Yalois

🍵Java对象的序列化和反序列化

知道了PHP的序列化,我竟然不会Java序列化,学! 先学个单词 Serialize v.序列化 英 [ˈsɪəriəlaɪz] 美 [ˈsɪriəlaɪz] 什么是对象的序列化 在Java中,序列化是指将对象转换为字节流的过程。序列化可以实现对象的持久化,转为字节流之后可以将其保存到文件、数据库或者在网络中传输。 **那什么是持久化呢?**持久化就是将内存中的数据保存起来使它能够长期存在。比如我把某个Java对象保存到本地的一个文件,下次使用的时候再反序列化出来用。 反序列就是逆过程,把字节流转化为对象。使字节流在内存中重新创建一个实际的Java对象。 下面是一个例子,不能说看完例子就学会实例化了,写代码的时候往往有很多情况和细节,这时候就需要多写一写代码,多思考了。(这是我对自己说的)不要只看文章前面 Java代码实现(例子) //代码由GPT提供 import java.io.*; // 定义一个可序列化的类 class Person implements Serializable { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } } public class SerializationExample { public static void main(String[] args) { Person person = new Person("Alice", 30); // 序列化对象 try { FileOutputStream fileOut = new FileOutputStream("person.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(person); out.close(); fileOut.close(); System.out.println("对象已序列化并保存到person.ser文件中"); } catch (IOException e) { e.printStackTrace(); } // 反序列化对象 try { FileInputStream fileIn = new FileInputStream("person.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); Person deserializedPerson = (Person) in.readObject(); in.close(); fileIn.close(); System.out.println("从person.ser文件中反序列化对象:" + deserializedPerson.name + " " + deserializedPerson.age); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } } 对象流 ObjectInputStream类和ObjectOutputStream类创建的对象称为对象输入流和对象输出流。 ...

June 11, 2024 · 3 min · Yalois