您的位置:首页 > 编程语言 > Java开发

使用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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: