Java 使用RMI

Java 使用RMI

Java使用序列化的方式,可以实现远端的方法调用,在分工合作时非常方便。本文记录使用java标准库实现rmi

一、服务端

结构

.
├── pom.xml
├── src
│   ├── main
│   │   └── java
│   │       └── hello
│   │           ├── HelloImpl.java
│   │           ├── HelloServer.java
│   │           └── IHello.java
│   └── test
│       └── java
│           └── mycom
│               └── AppTest.java
└── target

IHello.java

package hello;

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

public interface IHello extends Remote {
    public String sayHelloToSomeBody(String someBodyName) throws RemoteException;

HelloImpl.java

package hello;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class HelloImpl extends UnicastRemoteObject implements IHello {
    public HelloImpl() throws RemoteException {
        super();
    }
    public String sayHelloToSomeBody(String someBodyName) throws RemoteException {
        System.out.println("Connected sucessfully!");
        return "你好," + someBodyName + "!";
    }
}

HelloServer.java

package hello;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

public class HelloServer {
    public static void main(String args[]) {
        try {
            IHello rhello = new HelloImpl();
            LocateRegistry.createRegistry(8888);
            // 如果配置在远程服务器,把地址换成你的ip
            System.setProperty("java.rmi.server.hostname","127.0.0.1");
            Naming.bind("rmi://localhost:8888/RHello", rhello);
            System.out.println(">>>>>INFO:远程IHello对象绑定成功!");
        } catch (RemoteException e) {
            System.out.println("创建远程对象发生异常!");
            e.printStackTrace();
        } catch (AlreadyBoundException e) {
            System.out.println("发生重复绑定对象异常!");
            e.printStackTrace();
        } catch (MalformedURLException e) {
            System.out.println("发生URL畸形异常!");
            e.printStackTrace();
        }
    }
}

在服务端启动HelloServer.java就会在8888端口监听请求了

二、客户端

客户端只要分享接口文件就好了

启动代码

package hello;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class Client {
    public static void main(String args[]) {
        try {
            // 填写服务器ip
            IHello rhello = (IHello) Naming.lookup("rmi://127.0.0.1:8888/RHello");
            System.out.println(rhello.sayHelloToSomeBody("Erich"));
        } catch (NotBoundException e) {
        } catch (MalformedURLException e) {
            e.printStackTrace();
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

三、小结

可以看到,客户端只要得到接口文件就能执行操作,而具体的实现交给服务端完成,这种架构可以解耦调用和实现

转载于:https://www.cnblogs.com/fanghao/p/8918953.html

Java RMI(Remote Method Invocation)是 Java 中实现远程方法调用的一种机制,它允许一个 Java 程序从另一个 Java 程序中调用对象。下面是一个简单的 Java RMI 的示例: 1. 定义接口 首先需要定义一个接口,用于客户端和服务端之间进行通信。比如: ``` public interface MyInterface extends Remote { public String sayHello() throws RemoteException; } ``` 这里的 MyInterface 继承了 Remote 接口,表示这个接口是一个远程接口。 2. 实现接口 接下来需要在服务端实现这个接口,比如: ``` public class MyInterfaceImpl extends UnicastRemoteObject implements MyInterface { public MyInterfaceImpl() throws RemoteException { super(); } public String sayHello() throws RemoteException { return "Hello, world!"; } } ``` 这里的 MyInterfaceImpl 类实现了 MyInterface 接口,并继承了 UnicastRemoteObject 类。这个类的构造函数需要抛出 RemoteException 异常。 3. 注册服务 在服务端需要将 MyInterfaceImpl 的实例注册到 RMI registry 中,比如: ``` MyInterface myInterface = new MyInterfaceImpl(); Registry registry = LocateRegistry.getRegistry(); registry.bind("MyInterface", myInterface); ``` 这里使用了 LocateRegistry.getRegistry() 方法获取 RMI registry 的引用,然后使用 registry.bind() 方法将 MyInterfaceImpl 的实例注册到 RMI registry 中。 4. 调用服务 在客户端需要获取 MyInterfaceImpl 的实例并调用它的方法,比如: ``` Registry registry = LocateRegistry.getRegistry("localhost"); MyInterface myInterface = (MyInterface) registry.lookup("MyInterface"); String result = myInterface.sayHello(); System.out.println(result); ``` 这里使用了 registry.lookup() 方法获取 MyInterfaceImpl 的实例,然后调用它的 sayHello() 方法并输出结果。 需要注意的是,使用 RMI 调用远程方法时,可能会抛出 RemoteException 异常,需要进行处理。此外,还需要在客户端和服务端都使用相同的接口和实现类,以保证通信的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值