实现远程调用的方法
方法(一):利用java.rmi.registry.LocateRegistry实现RMI调用
1.创建远程接口
远程接口中声明了可以被客户程序访问的远程方法。只要一个类继承了java.rmi.Remote接口,该对象才能成为远程对象,对象中指定的方法才能被远程调用。
2.实现远程接口
3.生成存根(Stub)
这是运行前的截图:
A.先javac编译文件
B.然后生成存根
C.将存根放到客户端里
4.启动服务器程序
先start rmiregistry(如果代码中没有自带的启动服务的部分),后Java HelloServer(在Server文件夹下)
5.运行客户端程序
方法(二):利用javx.naming.Context实现RMI调用
- 将服务器代码和客户端代码进行更改,改变成使用naming.Context类的新代码,并编译
- 然后分别运行客户端和服务器端
签到系统实现
运行截图:
1.启动服务器
2.启动客户端
学生版:
老师版:
3.提交签到信息
学生显示:
老师显示:
4.查看数据是否存储
完成!
javax.naming.Context 与java.rmi.registry.LocateRegistry的区别
- Naming类只是在“远程对象注册表”上进行存储和读取操作,该类并不能创建“远程对象注册表”;
- LocateRegistry类可以获取“远程对象注册表”引用,或者创建本地主机上的“远程对象注册表”;
- Naming类方法封装了Registry接口方法,只需要一个URL就能对“远程对象注册表”进行相关操作。
- LocateRegistry类获取到Registry对象引用后,通过Registry类方法对“远程对象注册表”进行相关操作
错误总结:
1.尝试了不生成存根就启动client,出现报错
发现由于LocateRegistry 用于获取特定主机(包括本地主机)上的远程对象注册表的引用,或用于创建一个接受对特定端口调用的远程对象注册表。
所以要从client本地获取存根,所以用rmic生成存根并转移到client文件夹中后,代码正确运行。
2.rmic警告
仔细阅读后发现只是建议不再使用,实际查看文件夹下已经生成了Stub文件,所以不存在硬性问题。
3.1099端口占用问题
在使用服务器端的时候,要运行“start rmiregistry”来启动JDK自带的注册表程序,它用于保存Server类注册的远程对象并允许远程客户端的请求访问。然后再运行服务器端的Server类,即“java Server”,该程序向注册表中注册具体的远程对象。
但实际使用时出现了1099端口占用问题,打开了rmiregistry就无法启动服务器端,用netstat -ano,列出所有端口的情况后,发现rmiregistry本身占用了1099端口,再查看代码
所以代码中已经包含启动的部分,改进后并不需要手动启动,所以就直接运行即可。