使用Java的RMI完成远程调用

入门案例,仅供体验。



开发一个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&amp;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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值