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这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...
随机推荐
- 【C++】为什么构造函数没有返回值?(转载)
为什么构造函数没有返回值? 意见(1) 我认为构造函数隐含的返回值就是this,因为构造函数是在类的对象产生时自动调用.构造函数被调用也就意味着产生了一个对象,而this指针是与对象实体相关联的, ...
- 2018-9-30-C#-从零开始写-SharpDx-应用-画三角
title author date CreateTime categories C# 从零开始写 SharpDx 应用 画三角 lindexi 2018-09-30 18:30:14 +0800 20 ...
- Android 使用Toolbar+DrawerLayout快速实现仿“知乎APP”侧滑导航效果
在以前,做策划导航的时候,最常用的组件便是SlidingMenu了,当初第一次用它的时候觉得那个惊艳啊,体验可以说是非常棒. 后来,Android自己推出了一个可以实现策划导航的组件DrawerLay ...
- Laravel 的HTTP控制器
简介# 除了在路有文件中以闭包的形式定义所有的请求处理逻辑外,还可以使用控制器类来组织此类行为,控制器能够将相关 的请求处理逻辑组成的一个单独的类,控制器被存放在app/Http/Controller ...
- 洛谷P1507 NASA的食物计划
//二维费用背包 #include<bits/stdc++.h> using namespace std; ; ; ; int v1[maxn],v2[maxn],w[maxn],n,v1 ...
- 如何查看redis内存使用情况
https://jingyan.baidu.com/article/2c8c281dbd079f0008252a0f.html Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以 ...
- elasticsearch-倒排索引原理
倒排索引 Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索.一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表. 例如,假设我们有两个 ...
- H3C 帧中继虚电路
- hadoop 端口总结
localhost:50030/jobtracker.jsp localhost:50060/tasktracker.jsp localhost:50070/dfshealth.jsp 1. Name ...
- Python--day31--TCP的长链接