使用Java的RMI完成远程调用
2016-01-19 11:03
543 查看
入门案例,仅供体验。
开发一个rmi案例,分为以下几步:1. 创建远程接口及声明远程方法(继承Remote接口)
2. 实现远程接口及远程方法(继承UnicastRemoteObject)
3. 启动RMI注册服务,并注册远程对象
4. 客户端查找远程对象,并调用远程方法
5. 执行程序:启动服务、运行客户端进行调用
本案例用到数据库MySQL,给出建库建表语句:
CREATE DATABASE rmi; DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `age` int(11) DEFAULT NULL, `sno` varchar(50) DEFAULT NULL, `math` int(11) DEFAULT NULL, `chinese` int(11) DEFAULT NULL, `english` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
代码:
远程接口IStudentService
package doc_03_rmi.server; import java.rmi.Remote; import java.rmi.RemoteException; public interface IStudentService extends Remote { public boolean add(Student stu) throws RemoteException; public boolean deleteBySno(String sno) throws RemoteException; public boolean update(Student stu) throws RemoteException; public Student queryBySno(String sno) throws RemoteException; }
接口实现StudentServiceImpl
package doc_03_rmi.server; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; /** * 模块说明: web service interface * */ public class StudentServiceImpl extends UnicastRemoteObject implements IStudentService { private static final long serialVersionUID = 4448170447514198534L; public StudentServiceImpl() throws RemoteException { super(); } // query @Override public Student queryBySno(String sno) { StudentDAO sd = StudentDAO.getInstance(); return sd.queryBySno(sno); } // add @Override public boolean add(Student stu) { StudentDAO sd = StudentDAO.getInstance(); return sd.add(stu); } // delete @Override public boolean deleteBySno(String sno) { StudentDAO sd = StudentDAO.getInstance(); return sd.deleteBySno(sno); } // update @Override public boolean update(Student stu) { StudentDAO sd = StudentDAO.getInstance(); return sd.update(stu); } }
数据访问StudentDAO
package doc_03_rmi.server; import java.sql.ResultSet; import java.sql.SQLException; /** * 模块说明:数据访问 * */ public class StudentDAO { private final DBUtil db = DBUtil.getDBUtil(); private ResultSet rs; private static StudentDAO sd = null; private StudentDAO() { } public static synchronized StudentDAO getInstance() { if (sd == null) { sd = new StudentDAO(); } return sd; } // add public boolean add(Student stu) { boolean result = false; if (stu == null) { return result; } try { // insert String sql = "insert into student(name,sno,age,math,chinese,english) values(?,?,?,?,?,?)"; Object[] param = { stu.getName(), stu.getSno(), stu.getAge(), stu.getMath(), stu.getChinese(), stu.getEnglish() }; if (db.executeUpdate(sql, param) == 1) { result = true; } } finally { destroy(); } return result; } // delete public boolean deleteBySno(String sno) { boolean result = false; if (sno == null || "".equals(sno)) { return result; } String sql = "delete from student where sno=?"; String[] param = { sno }; int rowCount = db.executeUpdate(sql, param); if (rowCount == 1) { result = true; } destroy(); return result; } // update public boolean update(Student stu) { boolean result = false; if (stu == null) { return result; } try { // update String sql = "update student set name=?,age=?,math=?,chinese=?,english=? where sno=?"; Object[] param = { stu.getName(), stu.getAge(), stu.getMath(), stu.getChinese(), stu.getEnglish(), stu.getSno() }; int rowCount = db.executeUpdate(sql, param); if (rowCount == 1) { result = true; } } finally { destroy(); } return result; } // query by sno public Student queryBySno(String sno) { Student result = null; if ("".equals(sno) || sno == null) { return result; } String sql = "select * from student where sno=?"; String[] checkParam = { sno }; rs = db.executeQuery(sql, checkParam); try { if (rs.next()) { result = new Student(); result.setAge(rs.getInt("age")); result.setChinese(rs.getInt("chinese")); result.setEnglish(rs.getInt("english")); result.setMath(rs.getInt("math")); result.setName(rs.getString("name")); result.setSno(rs.getString("sno")); } } catch (SQLException e) { e.printStackTrace(); } finally { destroy(); } return result; } private void destroy() { try { if (rs != null) { rs.close(); } } catch (SQLException se) { se.printStackTrace(); } finally { db.close(); } } }
实体类Student,必须实现序列化
package doc_03_rmi.server; import java.io.Serializable; /** * 模块说明: 实体类Student * */ public class Student implements Serializable { private static final long serialVersionUID = 8387183977965821422L; private String name; // 名字 private int age; // 年龄 private String sno; // 学号 private int math; // 数学成绩 private int chinese; // 语文成绩 private int english; // 英语成绩 public int getTotal() { return (math + chinese + english); } public int getAvg() { return getTotal() / 3; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSno() { return sno; } public void setSno(String sno) { this.sno = sno; } public int getMath() { return math; } public void setMath(int math) { this.math = math; } public int getChinese() { return chinese; } public void setChinese(int chinese) { this.chinese = chinese; } public int getEnglish() { return english; } public void setEnglish(int english) { this.english = english; } }
数据库工具类DBUtil
package doc_03_rmi.server; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * 模块说明:数据库工具类 * */ public class DBUtil { private static DBUtil db; private Connection conn; private PreparedStatement ps; private ResultSet rs; private DBUtil() { } public static DBUtil getDBUtil() { if (db == null) { db = new DBUtil(); } return db; } public int executeUpdate(String sql) { int result = -1; if (getConn() == null) { return result; } try { ps = conn.prepareStatement(sql); result = ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } return result; } public int executeUpdate(String sql, Object[] obj) { int result = -1; if (getConn() == null) { return result; } try { ps = conn.prepareStatement(sql); for (int i = 0; i < obj.length; i++) { ps.setObject(i + 1, obj[i]); } result = ps.executeUpdate(); close(); } catch (SQLException e) { e.printStackTrace(); } return result; } public ResultSet executeQuery(String sql) { if (getConn() == null) { return null; } try { ps = conn.prepareStatement(sql); rs = ps.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } return rs; } public ResultSet executeQuery(String sql, Object[] obj) { if (getConn() == null) { return null; } try { ps = conn.prepareStatement(sql); for (int i = 0; i < obj.length; i++) { ps.setObject(i + 1, obj[i]); } rs = ps.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } return rs; } private Connection getConn() { try { if (conn == null || conn.isClosed()) { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:3306/rmi?useUnicode=true&characterEncodeing=UTF-8", "root", "root"); } } catch (ClassNotFoundException e) { System.out.println("jdbc driver is not found."); e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } public void close() { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } }
注册服务、注册远程对象:
package doc_03_rmi.server; import java.rmi.Naming; import java.rmi.registry.LocateRegistry; public class Register { public static void main(String[] args) { try { IStudentService personService = new StudentServiceImpl(); // 注册通讯端口 LocateRegistry.createRegistry(6600); // 注册通讯路径 Naming.rebind("rmi://127.0.0.1:6600/PersonService", personService); System.out.println("Service Start!"); } catch (Exception e) { e.printStackTrace(); } } }
客户端:
package doc_03_rmi.client; import java.rmi.Naming; import doc_03_rmi.server.IStudentService; import doc_03_rmi.server.Student; /** * 模块说明: 使用java的RMI完成对增/删/改/查的远程调用 * */ public class Client { public static void main(String[] args) { try { // 调用远程对象,注意RMI路径与接口必须与服务器配置一致 IStudentService studentService = (IStudentService) Naming.lookup("rmi://127.0.0.1:6600/PersonService"); // add Student studentAdd = new Student(); studentAdd.setAge(40); studentAdd.setName("zhugeliang"); studentAdd.setSno("009"); studentAdd.setChinese(50); studentAdd.setEnglish(80); studentAdd.setMath(90); boolean isSuccess = studentService.add(studentAdd); System.out.println("add is successful? " + isSuccess); // query Student stu = studentService.queryBySno("009"); System.out.println(stu.getName() + " " + stu.getAge() + " " + stu.getSno() + " " + stu.getChinese() + " " + stu.getMath() + " " + stu.getEnglish()); // update Student studentUpdate = new Student(); studentUpdate.setAge(20); studentUpdate.setName("zhugeliang"); studentUpdate.setSno("009"); studentUpdate.setChinese(70); studentUpdate.setEnglish(70); studentUpdate.setMath(70); boolean updateIsSuccess = studentService.add(studentUpdate); System.out.println("update is successful? " + updateIsSuccess); // delete boolean delIsSuccess = studentService.deleteBySno("009"); System.out.println("delete is successful? " + delIsSuccess); } catch (Exception ex) { ex.printStackTrace(); } } }
运行结果(仅供参考):
end.
相关文章推荐
- Spring task @Async执行失败原因分析
- JavaSE入门学习3:搭建Java开发环境(一)
- JVM内存区域划分(JDK6/7/8中的变化)
- JVM内存区域划分(JDK6/7/8中的变化)
- Java变量以及内存分配(非常重要)
- Java变量以及内存分配
- spring 子类覆盖父类中注入的bean
- Java-面向对象概念
- springmvc学习3:处理器映射器和适配器
- Quartz使用问题: 如何将被Spring管理的类注入到不被Spring管理的Job类中
- 15、IO流
- eclipse中xml文件报错异常处理
- spring接口实现类 依赖注入
- 使用JAVA反射机制将简单JAVA been对象、数组转化为对应的Json串
- 【转】Java Thread.join()详解
- 用java下载hdfs文件报NullPointerException
- Dijkstra算法求最短路径(java)(转)
- spring quartz任务调度
- 基于JAVA集合框架实现一个简单的学生管理系统
- java发送内嵌图片邮件