java项目中rmi远程调用实例
1.创建一个学生实体类Student.java:
package com.RMIdemo.entity;
@SuppressWarnings("serial")
public class Student implements java.io.Serializable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
public Student() {
super();
}
}
2.创建一个远程接口StudentDao.java,由于是远程接口所以需要继承 Remote:
package com.RMIdemo.dao; import java.rmi.Remote;
import java.rmi.RemoteException; //此为远程对象调用的接口,必须继承Remote类
public interface StudentDao extends Remote{ //获取所有学生信息
public String getStudentList()throws RemoteException;
}
3.实现这个接口StudentDaoImpl.java,这个实现类需要继承UnicastRemoteObject:
package com.RMIdemo.daoImpl; import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import com.RMIdemo.dao.DBConnUtil;
import com.RMIdemo.dao.StudentDao;
import com.RMIdemo.entity.Student; @SuppressWarnings("serial")
public class StudentDaoImpl extends UnicastRemoteObject implements StudentDao { public StudentDaoImpl() throws RemoteException {
super();
} public String getStudentList() throws RemoteException { List<Student> list = new ArrayList<Student>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select * from student";
conn = DBConnUtil.getConn();
int i = 1;
try {
ps = conn.prepareStatement(sql); rs = ps.executeQuery();
while (rs.next()) {
Student stu = new Student();
stu.setId(rs.getInt("id"));
stu.setName(rs.getString("name"));
list.add(stu);
}
} catch (SQLException e) { e.printStackTrace();
} finally {
DBConnUtil.closeAll(rs, ps, conn);
} net.sf.json.JSONArray json = net.sf.json.JSONArray.fromObject(list); return json.toString(); } }
4.连接数据库时用的是JDBC所以需要建立DBConnUtil.java这个连接数据库的工具类:
package com.RMIdemo.daoImpl; import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import com.RMIdemo.dao.DBConnUtil;
import com.RMIdemo.dao.StudentDao;
import com.RMIdemo.entity.Student; @SuppressWarnings("serial")
public class StudentDaoImpl extends UnicastRemoteObject implements StudentDao { public StudentDaoImpl() throws RemoteException {
super();
} public String getStudentList() throws RemoteException { List<Student> list = new ArrayList<Student>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select * from student";
conn = DBConnUtil.getConn();
int i = 1;
try {
ps = conn.prepareStatement(sql); rs = ps.executeQuery();
while (rs.next()) {
Student stu = new Student();
stu.setId(rs.getInt("id"));
stu.setName(rs.getString("name"));
list.add(stu);
}
} catch (SQLException e) { e.printStackTrace();
} finally {
DBConnUtil.closeAll(rs, ps, conn);
} net.sf.json.JSONArray json = net.sf.json.JSONArray.fromObject(list); return json.toString(); } }
5.这是连接数据库的配置文件database.properties

6.创建服务端StudenServer.java:
package com.RMIdemo.rmi; import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import com.RMIdemo.dao.StudentDao;
import com.RMIdemo.daoImpl.StudentDaoImpl; public class StudentServer {
/**
* 启动 RMI 注册服务并进行对象注册
*/
public static void main(String[] argv) {
try {
// 启动RMI注册服务,指定端口为1099 (1099为默认端口)
// 也可以通过命令 $java_home/bin/rmiregistry 1099启动
// 这里用这种方式避免了再打开一个DOS窗口
// 而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所用
LocateRegistry.createRegistry(1099); // 创建远程对象的一个或多个实例,下面是stu对象
// 可以用不同名字注册不同的实例 // 把hello注册到RMI注册服务器上,命名为stu;注意:此处如果用的是Spring框架的话我们需要先加载Spring的配置文件
StudentDao stu=new StudentDaoImpl();
Naming.rebind("stu", stu); // 如果要把stu实例注册到另一台启动了RMI注册服务的机器上
// Naming.rebind("//机器IP地址:1099/stu",stu);
System.out.println("服务器已启动!");
} catch (Exception e) {
System.out.println("服务器启动失败: " + e);
}
}
}
7.建立客户端StudentClient.java:
package com.RMIdemo.rmi;
import java.rmi.Naming; import javax.servlet.http.HttpServletRequest; import com.RMIdemo.dao.StudentDao;
import com.RMIdemo.util.jsonpUtil; public class StudentClient
{
/**
* 查找远程对象并调用远程方法
*/
public static void main(String[] argv)
{
try
{
StudentDao stu = (StudentDao) Naming.lookup("stu"); //如果要从另一台启动了RMI注册服务的机器上查找hello实例
//StudentDao stu = (StudentDao) Naming.lookup("//192.168.1.21:1099/stu"); //调用远程方法 JDBC连接数据库方式
jsonpUtil jsonp=new jsonpUtil();
String callBack=jsonp.returnJsonp2(stu.getStudentList());
System.out.println(callBack);
}
catch (Exception e)
{
System.out.println("服务器异常: " + e);
}
}
}
下面是我们先运行服务端代码:

这个时候就证明服务端成功启动!
接着运行客户端代码:

此时如果我们看到控制台有服务器返回的数据就代表我们大功告成了!
java项目中rmi远程调用实例的更多相关文章
- Java中RMI远程调用demo
Java远程方法调用,即Java RMI(Java Remote Method Invocation),一种用于实现远程过程调用的应用程序编程接口.它使客户机上运行的程序可以调用远程服务器上的对象.远 ...
- 在java项目中使用log4j的实例
测试log4j的项目结构 Log4j.properties的路径为 src/config/log4j Log4j.properties文件的内容 下面定义日志输出级别是 INFO,并且配置了2个 ...
- java RMI 远程调用
1.背景 在学习代理模式的过程中接触到了远程调用,jdk有自己的RMI实现,所以这边自己实现了RMI远程调用,并记录下心得. 感受最深的是RMI和现在的微服务有点相似,都是通过"注册中心&q ...
- Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决
问题描述: mac笔记本本身会自带几个python版本,比如python2.7版本,我没有改动mac默认的python版本,只是安装了python3.7版本. 使用Pycharm开发Python项目没 ...
- JAVA项目中公布WebService服务——简单实例
1.在Java项目中公布一个WebService服务: 怎样公布? --JDK1.6中JAX-WS规范定义了怎样公布一个WebService服务. (1)用jdk1.6.0_21以后的版本号公布. ( ...
- UCenter在JAVA项目中实现的单点登录应用实例
Comsenz(康盛)的UCenter当前在国内的单点登录领域占据绝对份额,其完整的产品线令UCenter成为了账号集成方面事实上的标准. 基于UCenter,可以将Comsenz旗下的Discuz! ...
- ckeditor编辑器在java项目中配置
一.基本使用: 1.所需文件架包 A. Ckeditor基本文件包,比如:ckeditor_3.6.2.zip 下载地址:http://ckeditor.com/download 2.配置使用 A.将 ...
- JAVA项目中常用的异常处理情况总结
JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...
- JAVA项目中常用的异常知识点总结
JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...
随机推荐
- 【Leetcode链表】两两交换链表中的节点(24)
题目 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表.你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, 你应该返回 2- ...
- Laravel引入第三方库的方法
https://blog.csdn.net/will5451/article/details/52472695 1.首先在app目录下创建一个新的文件夹,命名libs(可自定义) 2.(可选)考虑到后 ...
- poj 3334 Connected Gheeves (Geometry + BInary Search)
3334 -- Connected Gheeves 题意是,给出两个尖形的相连的容器,要求向其中灌水.它们具有日常的物理属性,例如两个容器中水平面高度相同以及水高于容器顶部的时候就会溢出.开始的时候打 ...
- iptables禁止代理端口
#iptables -A INPUT -p tcp --dport 3128 -j REJECT
- let & const 命令
一.let命令 用于声明变量. 1) 所声明的变量只在let命令所在代码块内有效.(块级作用域) { let a=10; var b=1; } a // ReferenceError: a is no ...
- phpstorm IDEA 双击Shift键会弹出 SearchEverywhere 对话框,如何取消这个功能
https://blog.csdn.net/qq_27598243/article/details/80526352 解决方法:一:Open lib/resources.jar/idea/Platfo ...
- HTTP协议详解以及URL具体访问过程(转载)
https://blog.csdn.net/f45056231p/article/details/82533490
- Pytorch | BERT模型实现,提供转换脚本【横扫NLP】
<谷歌终于开源BERT代码:3 亿参数量,机器之心全面解读>,上周推送的这篇文章,全面解读基于TensorFlow实现的BERT代码.现在,PyTorch用户的福利来了:一个名为Huggi ...
- HTML 标签:常规元素和空元素
HTML标签分为空元素和常规元素 其中空元素是自关闭的,不需要成对地添加关闭标签. 空元素包括:img,input,textarea,select,br,hr,command,link,keygen, ...
- Python--day28--set去重
set去重:set依赖对象hash eq