发表于: 2019-12-13 19:54:03

1 1202


今天完成的事:
1、使用java rmi简单测试。
这里就是在本地进行测试,没有将服务端部署到服务器。
按照案例测试,结果发现运行server,进行远程对象绑定测试,发现测试类一直在运行,以为代码有问题,也没仔细看代码,其实是因为有“while(true);”,所以永久运行。

将server测试关闭,而后测试客户端调用远程对象上的远程方法,报错如下。
百度有说是因为需要先运行注册表,于是开始尝试,然而并没有解决。

照着另一个例子来,将测试类删除,server与客户端调用远程方法的类中方法改为main方法。使用cmd的形式进行操作。
没有开启注册表,直接这样就成功了。。不知道为啥。。

再次使用idea运行就可以了。。原来是这里的server就是一直在运行,才可以使用客户端测试。

原来前一个测试类连接server,测试成功后关闭了,所以再测试客户端调用就会报错。。

测试结构:

HelloDefine(定义远程接口):
package com.jnshu.rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
// 定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常
public interface HelloDefine extends Remote {
    public String helloWorld() throws RemoteException;
    public String sayHello(String name) throws RemoteException;
}
HelloDefineImp(远程接口的实现):
package com.jnshu.rmi;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
// 远程的接口的实现
public class HelloDefineImp extends UnicastRemoteObject implements HelloDefine  {
    // 该构造器必须存在,因为继承了UnicastRemoteObject类,其构造器要抛出RemoteException
    public HelloDefineImp() throws RemoteException {
        super();
    }
    public String helloWorld() throws RemoteException {
        return "Hello AlphaGo!";
    }
    public String sayHello(String name) throws RemoteException {
        return "Hello" + name +"!";
    }
}
HelloServer(创建远程对象,注册到RMI注册表):
package com.jnshu.rmi;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
// 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。
public class HelloServer {
    public void server() {
        try {
            // 创建一个远程对象
            HelloDefine hello = new HelloDefineImp();
            // 远程对象注册表实例
            // 本地主机上的远程对象注册表Registry的实例,并指定端口为8888,
            // 这一步必不可少(Java默认端口是1099),必不可缺的一步,
            // 缺少注册表创建,则无法绑定对象到远程注册表上
            LocateRegistry.createRegistry(8888);
            // 把远程对象注册到RMI注册服务器上
            // 绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)
            Naming.bind("rmi://localhost:8888/Hello", hello);
  //        Naming.bind("//localhost:8888/Hello", hello);
            System.out.println("server:对象绑定成功!666");
        } 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();
        }
    }
}
HelloClient(客户端调用远程对象上的远程方法):
package com.jnshu.rmi;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
// 客户端测试,在客户端调用远程对象上的远程方法,并返回结果。
public class HelloClient {
    public void client() {
        try {
            // 在RMI服务注册表中查找名称为Hello的对象,并调用其上的方法
            HelloDefine hello = (HelloDefine) Naming.lookup("rmi://localhost:8888/Hello");
            // 调用远程对象方法
            System.out.println("client:");
            System.out.println(hello.helloWorld());
            System.out.println(hello.sayHello("神之一手222"));
        } catch (NotBoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}
测试类:
package com.jnshu.rmi;
import org.junit.Test;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class RMITest {
    @Test
    public void testServer() throws RemoteException, MalformedURLException, AlreadyBoundException {
        HelloServer server = new HelloServer();
        server.server();
        // 为了保持server的连接不间断,一旦关闭,就会造成下一个测试报错,无法连接异常
        while(true);
    }
    @Test
    public void testClient() throws MalformedURLException, RemoteException, NotBoundException {
        HelloClient client = new HelloClient();
        client.client();
    }
}
若分别在本地或服务器上部署代码,参考:https://blog.csdn.net/dengjili/article/details/79750093
2、实现spring-RMI。
看的例子实现的不对,是创建了3个模块,接口是单独一个,实现类一个,最后一个配的controller,我以为是客户端,前两个就是服务端,所以把前两个合为一个,结果发现第一个是服务端,第二个是客户端,第三个是测试用的。。明天再整理下。
明天计划的事:
1、实现spring-RMI。
2、将项目代码使用RMI分离。
遇到的问题:
spring-RMI没有实现,明天尝试下。
收获:
1、使用java rmi简单测试。
2、查看了spring-RMI。

返回列表 返回列表
评论

    分享到