入门案例,仅供体验。
开发一个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.