RMI:远程方法调用(Remote Method Invocation)。能够让A电脑的java虚拟机上的对象调用B电脑的java 虚拟机中的对象上的方法。类似于websocket的远程调用

这里写图片描述

所需代码

客户端代码:链接: https://pan.baidu.com/s/1t5DaLvbNzbRikVYBWrDa_Q 密码: iptc

RmiTestClient

- - rmi
- - - - client

- - - - - - HelloClient.java

- - - - server

- - - - - - Hello.java

客户端代码,服务器地址根据具体的ip所定,端口任意

package rmi.client;

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

import rmi.server.Hello;

public class HelloClient {
    public static void main(String[] args) {  
        try {  
            Hello h = (Hello)Naming.lookup("rmi://192.168.1.19:12312/Hello");  
            System.out.println(h.sayHello("xxxx"));  
        } catch (MalformedURLException e) {  
            System.out.println("url格式异常");  
        } catch (RemoteException e) {  
            System.out.println("创建对象异常");  
            e.printStackTrace();  
        } catch (NotBoundException e) {  
            System.out.println("对象未绑定");  
        }  
    }  
}

所调接口

package rmi.server;

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

public interface Hello extends Remote {
    String sayHello(String name) throws RemoteException;
}

服务端代码:链接: https://pan.baidu.com/s/1tmX7EnDK3UahWOAz_1vw1Q 密码: m2ti

RmiTestServer

- - rmi

- - - - server

- - - - - - Hello.java

- - - - - - HelloImpl.java

- - - - - - HelloServer.java

接口

package rmi.server;

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

public interface Hello extends Remote {
    String sayHello(String name) throws RemoteException;
}

实现

package rmi.server;

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

public class HelloImpl extends UnicastRemoteObject implements Hello {

    private static final long serialVersionUID = 1L;

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

    @Override
    public String sayHello(String name) throws RemoteException {
        return "hello, " + name;
    }

}

服务端代码,服务器地址根据具体的ip所定,端口任意

package rmi.server;

import java.rmi.Naming;

public class HelloServer {  
    public static void main(String[] args) {  
        try{  
            Hello h = new HelloImpl();  
            Naming.bind("rmi://192.168.1.19:12312/Hello", h);  
            System.out.println("HelloServer启动成功");  
        }catch(Exception e){  
            e.printStackTrace();  
        }  
    }  
}  

环境装备

客户端和服务端的搭建

客户端为windows系统,服务端为ubantu系统

ubantu下载与安装(virtualBox)参考:https://blog.csdn.net/dengjili/article/details/77828935

windows控制虚拟机linux参考:https://blog.csdn.net/dengjili/article/details/77998255

查看服务器地址

这里写图片描述

配置/etc/hosts文件
  • 将hostname对应ip修改为当前ip
  • 验证命令hostname -i

这里写图片描述

客户端ping服务端网络是否通

这里写图片描述

服务端代码部署

将代码上传到服务器

windows与虚拟机linux文件传输参考:https://blog.csdn.net/dengjili/article/details/78006151

这里写图片描述

编译服务端代码

ubantu安装java环境参考:https://blog.csdn.net/dengjili/article/details/79744472

进入工程,编译java文件生成class文件

执行命令

javac rmi/server/*.java

这里写图片描述

生成rmi所需要的stub文件
配置classpath

查询当前工程目录
这里写图片描述
将当前目录添加进classpath中
执行命令,修改

sudo vim /etc/profile

这里写图片描述

在工程目录,执行命令

rmic rmi.server.HelloImpl

这里写图片描述

生成文件
这里写图片描述

编译客户端代码

进入客户端路径
ps:当前为windows系统

执行命令

javac -encoding UTF-8 rmi/client/*.java
javac -encoding UTF-8 rmi/server/*.java

执行结果
这里写图片描述

这里写图片描述

将服务器stub文件拷贝到客户端对应位置

这里写图片描述

操作后
这里写图片描述

启动RMI注册服务

特别重要
当前操作目录一定要在服务器代码的工程目录执行
这里写图片描述

执行命令

rmiregistry 12312 &

这里写图片描述

运行服务端

执行命令

java rmi.server.HelloServer

这里写图片描述

注意事项

当ctrl+c结束当前程序,再次执行启动命令会报错
这里写图片描述

解决方法,重新进行RMI注册服务

执行命令

ps -ef | grep rmiregistry

这里写图片描述

kill进程,执行命令

kill 1690

这里写图片描述

重新操作即可成功
这里写图片描述

运行客户端

执行命令

java rmi.client.HelloClient

这里写图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐