发表于: 2019-12-13 19:54:03
1 1201
今天完成的事:
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。
评论