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远程调用实例的更多相关文章

  1. Java中RMI远程调用demo

    Java远程方法调用,即Java RMI(Java Remote Method Invocation),一种用于实现远程过程调用的应用程序编程接口.它使客户机上运行的程序可以调用远程服务器上的对象.远 ...

  2. 在java项目中使用log4j的实例

    测试log4j的项目结构 Log4j.properties的路径为    src/config/log4j Log4j.properties文件的内容 下面定义日志输出级别是 INFO,并且配置了2个 ...

  3. java RMI 远程调用

    1.背景 在学习代理模式的过程中接触到了远程调用,jdk有自己的RMI实现,所以这边自己实现了RMI远程调用,并记录下心得. 感受最深的是RMI和现在的微服务有点相似,都是通过"注册中心&q ...

  4. Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决

    问题描述: mac笔记本本身会自带几个python版本,比如python2.7版本,我没有改动mac默认的python版本,只是安装了python3.7版本. 使用Pycharm开发Python项目没 ...

  5. JAVA项目中公布WebService服务——简单实例

    1.在Java项目中公布一个WebService服务: 怎样公布? --JDK1.6中JAX-WS规范定义了怎样公布一个WebService服务. (1)用jdk1.6.0_21以后的版本号公布. ( ...

  6. UCenter在JAVA项目中实现的单点登录应用实例

    Comsenz(康盛)的UCenter当前在国内的单点登录领域占据绝对份额,其完整的产品线令UCenter成为了账号集成方面事实上的标准. 基于UCenter,可以将Comsenz旗下的Discuz! ...

  7. ckeditor编辑器在java项目中配置

    一.基本使用: 1.所需文件架包 A. Ckeditor基本文件包,比如:ckeditor_3.6.2.zip 下载地址:http://ckeditor.com/download 2.配置使用 A.将 ...

  8. JAVA项目中常用的异常处理情况总结

    JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...

  9. JAVA项目中常用的异常知识点总结

    JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...

随机推荐

  1. jQuery学习笔记之解除重复点击事情重复绑定

    问题:有不同的按钮点击后都执行相同的事件,在jQuery重复点击就会产生事件重复绑定. 解决方法:使用unbind("click")方法,每次点击都先接触绑定已有事件再绑定新对象. ...

  2. laravel 的路由中间件

    简介# Laravel 中间件提供了一种方便的机制来过滤进入应用的HTTP请求.例如,Laravel 内置了一个中间件来验证用户的身份认证 , 如果没有通过身份认证,中间件会将用户重定向到登陆界面,但 ...

  3. js中字符串拼接html

    1.使用转义字符 ": " " "+userName+" " " 效果:"userName" 2. 单引号中拼 ...

  4. OpenStack组件系列☞Keystone搭建

    一:版本信息 官网:http://docs.openstack.org/newton/install-guide-rdo/keystone.html 二:部署keystone 官网文档:http:// ...

  5. oracle函数 ln(y)

    [功能]返回以e为底的y的对数(e为数学常量) [参数]y,数字型表达式 (条件y>0) [返回]数字 [示例] select exp(3),exp(-3),ln(20.0855369),ln( ...

  6. hdu 1289 Hat’s IEEE

    Problem - 1289 好题.其实就是模拟IEEE754的格式,不过要注意的是,这里用的32位是float,用double就不对了. 代码如下: #include <cstdio> ...

  7. oracle避免在索引列上使用IS NULL和IS NOT NULL

    避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空 ...

  8. ccf-201403-3有趣的命令行

    傻逼题,要是考试只能得0分.. 提供几组傻逼数据,这要是在真实的生活中一定是错的... 还是要好好读题吧,全凭自己的感觉就得0分 albw:x 4 ls -a docu Case 1: -a ls - ...

  9. Android TextView点击效果

    在Android开发中,我们有时候需要单独的点击某一段文本,如图所示: 如上图,我们要求点击新用户注册这个TextView,为了有更好的用户体验,我们肯定要设置该TextView的点击效果.下面介绍如 ...

  10. 2018-2-13-WPF-DelegateCommand-出现Specified-cast-is-not-valid

    title author date CreateTime categories WPF DelegateCommand 出现Specified cast is not valid lindexi 20 ...