实现远程调用的方法

方法(一):利用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调用

  1. 将服务器代码和客户端代码进行更改,改变成使用naming.Context类的新代码,并编译

 

  1. 然后分别运行客户端和服务器端

 

签到系统实现

运行截图:

1.启动服务器

 

2.启动客户端

学生版:

 

老师版:

 

3.提交签到信息

学生显示:

 

老师显示:

 

4.查看数据是否存储

 

完成!

 javax.naming.Context 与java.rmi.registry.LocateRegistry的区别

  1. Naming类只是在“远程对象注册表”上进行存储和读取操作,该类并不能创建“远程对象注册表”;
  2. LocateRegistry类可以获取“远程对象注册表”引用,或者创建本地主机上的“远程对象注册表”;
  3. Naming类方法封装了Registry接口方法,只需要一个URL就能对“远程对象注册表”进行相关操作。
  4. 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端口,再查看代码

所以代码中已经包含启动的部分,改进后并不需要手动启动,所以就直接运行即可。

原文地址:https://www.cnblogs.com/STK0210/p/10265577.html