java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE, JavaME, JavaSE)的总称。本站提供基于Java框架struts,spring,hibernate等的桌面应用、web交互及移动终端的开发技巧与资料

保持永久学习的心态,将成就一个优秀的你,来 继续搞起java知识。

入门案例,仅供体验。

开发一个rmi案例,分为以下几步: 1. 创建远程接口及声明远程方法(继承Remote接口)

2. 实现远程接口及远程方法(继承UnicastRemoteObject)

3. 启动RMI注册服务,并注册远程对象

4. 客户端查找远程对象,并调用远程方法

5. 执行程序:启动服务、运行客户端进行调用

本案例用到数据库MySQL,给出建库建表语句:

1CREATE 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

1package 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

1package 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

1package 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,必须实现序列化

1package 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

1package 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(&quot;com.mysql.<a href="http://www.cfei.net/archives/tag/jdbc" title="浏览关于“jdbc”的文章" target="_blank" class="tag_link">jdbc</a>.Driver&quot;);
                conn = DriverManager.getConnection(
                        &quot;jdbc:mysql://127.0.0.1:3306/rmi?useUnicode=true&amp;amp;characterEncodeing=UTF-8&quot;, &quot;root&quot;,
                        &quot;root&quot;);
            }
        } catch (ClassNotFoundException e) {
            System.out.println(&quot;jdbc driver is not found.&quot;);
            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();
        }
    }
}

注册服务、注册远程对象:

1package 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();
        }
    }
}

客户端:

1package doc_03_rmi.client;

import java.rmi.Naming;

import doc_03_rmi.server.IStudentService;
import doc_03_rmi.server.Student;

/**
 * 模块说明: 使用java的RMI完成对增/删/改/查的<a href="http://www.cfei.net/archives/tag/%e8%bf%9c%e7%a8%8b%e8%b0%83%e7%94%a8" title="浏览关于“远程调用”的文章" target="_blank" class="tag_link">远程调用</a>
 * 
 */
public class Client {
    public static void main(String[] args) {
        try {
            // 调用远程对象,注意RMI路径与接口必须与服务器配置一致
            IStudentService studentService = (IStudentService) Naming.lookup(&quot;rmi://127.0.0.1:6600/PersonService&quot;);

            // add
            Student studentAdd = new Student();
            studentAdd.setAge(40);
            studentAdd.setName(&quot;zhugeliang&quot;);
            studentAdd.setSno(&quot;009&quot;);
            studentAdd.setChinese(50);
            studentAdd.setEnglish(80);
            studentAdd.setMath(90);
            boolean isSuccess = studentService.add(studentAdd);
            System.out.println(&quot;add is successful?  &quot; + isSuccess);

            // query
            Student stu = studentService.queryBySno(&quot;009&quot;);
            System.out.println(stu.getName() + &quot; &quot; + stu.getAge() + &quot; &quot; + stu.getSno() + &quot; &quot; + stu.getChinese() + &quot; &quot;
                    + stu.getMath() + &quot; &quot; + stu.getEnglish());

            // update
            Student studentUpdate = new Student();
            studentUpdate.setAge(20);
            studentUpdate.setName(&quot;zhugeliang&quot;);
            studentUpdate.setSno(&quot;009&quot;);
            studentUpdate.setChinese(70);
            studentUpdate.setEnglish(70);
            studentUpdate.setMath(70);
            boolean updateIsSuccess = studentService.add(studentUpdate);
            System.out.println(&quot;update is successful?  &quot; + updateIsSuccess);

            // delete
            boolean delIsSuccess = studentService.deleteBySno(&quot;009&quot;);
            System.out.println(&quot;delete is successful?  &quot; + delIsSuccess);

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

运行结果(仅供参考):

end.

javarmi远程调用jdbc

因为水平有限,难免有疏忽或者不准确的地方,希望大家能够直接指出来,我会及时改正。一切为了知识的分享。

后续会有更多的精彩的内容分享给大家。