1.創建一個學生實體類Student.java:
package com.RMIdemo.entity;
@SuppressWarnings("serial")
public class Student implements java.io.Serializable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
public Student() {
super();
}
}
2.創建一個遠程接口StudentDao.java,由於是遠程接口所以需要繼承 Remote:
package com.RMIdemo.dao;
import java.rmi.Remote;
import java.rmi.RemoteException;
//此為遠程對象調用的接口,必須繼承Remote類
public interface StudentDao extends Remote{
//獲取所有學生信息
public String getStudentList()throws RemoteException;
}
3.實現這個接口StudentDaoImpl.java,這個實現類需要繼承UnicastRemoteObject:
package com.RMIdemo.daoImpl;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.RMIdemo.dao.DBConnUtil;
import com.RMIdemo.dao.StudentDao;
import com.RMIdemo.entity.Student;
@SuppressWarnings("serial")
public class StudentDaoImpl extends UnicastRemoteObject implements StudentDao {
public StudentDaoImpl() throws RemoteException {
super();
}
public String getStudentList() throws RemoteException {
List<Student> list = new ArrayList<Student>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select * from student";
conn = DBConnUtil.getConn();
int i = 1;
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
Student stu = new Student();
stu.setId(rs.getInt("id"));
stu.setName(rs.getString("name"));
list.add(stu);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBConnUtil.closeAll(rs, ps, conn);
}
net.sf.json.JSONArray json = net.sf.json.JSONArray.fromObject(list);
return json.toString();
}
}
4.連接數據庫時用的是JDBC所以需要建立DBConnUtil.java這個連接數據庫的工具類:
package com.RMIdemo.daoImpl;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.RMIdemo.dao.DBConnUtil;
import com.RMIdemo.dao.StudentDao;
import com.RMIdemo.entity.Student;
@SuppressWarnings("serial")
public class StudentDaoImpl extends UnicastRemoteObject implements StudentDao {
public StudentDaoImpl() throws RemoteException {
super();
}
public String getStudentList() throws RemoteException {
List<Student> list = new ArrayList<Student>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select * from student";
conn = DBConnUtil.getConn();
int i = 1;
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
Student stu = new Student();
stu.setId(rs.getInt("id"));
stu.setName(rs.getString("name"));
list.add(stu);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBConnUtil.closeAll(rs, ps, conn);
}
net.sf.json.JSONArray json = net.sf.json.JSONArray.fromObject(list);
return json.toString();
}
}
5.這是連接數據庫的配置文件database.properties

6.創建服務端StudenServer.java:
package com.RMIdemo.rmi;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import com.RMIdemo.dao.StudentDao;
import com.RMIdemo.daoImpl.StudentDaoImpl;
public class StudentServer {
/**
* 啟動 RMI 注冊服務並進行對象注冊
*/
public static void main(String[] argv) {
try {
// 啟動RMI注冊服務,指定端口為1099 (1099為默認端口)
// 也可以通過命令 $java_home/bin/rmiregistry 1099啟動
// 這里用這種方式避免了再打開一個DOS窗口
// 而且用命令rmiregistry啟動注冊服務還必須事先用RMIC生成一個stub類為它所用
LocateRegistry.createRegistry(1099);
// 創建遠程對象的一個或多個實例,下面是stu對象
// 可以用不同名字注冊不同的實例
// 把hello注冊到RMI注冊服務器上,命名為stu;注意:此處如果用的是Spring框架的話我們需要先加載Spring的配置文件
StudentDao stu=new StudentDaoImpl();
Naming.rebind("stu", stu);
// 如果要把stu實例注冊到另一台啟動了RMI注冊服務的機器上
// Naming.rebind("//機器IP地址:1099/stu",stu);
System.out.println("服務器已啟動!");
} catch (Exception e) {
System.out.println("服務器啟動失敗: " + e);
}
}
}
7.建立客戶端StudentClient.java:
package com.RMIdemo.rmi;
import java.rmi.Naming;
import javax.servlet.http.HttpServletRequest;
import com.RMIdemo.dao.StudentDao;
import com.RMIdemo.util.jsonpUtil;
public class StudentClient
{
/**
* 查找遠程對象並調用遠程方法
*/
public static void main(String[] argv)
{
try
{
StudentDao stu = (StudentDao) Naming.lookup("stu");
//如果要從另一台啟動了RMI注冊服務的機器上查找hello實例
//StudentDao stu = (StudentDao) Naming.lookup("//192.168.1.21:1099/stu");
//調用遠程方法 JDBC連接數據庫方式
jsonpUtil jsonp=new jsonpUtil();
String callBack=jsonp.returnJsonp2(stu.getStudentList());
System.out.println(callBack);
}
catch (Exception e)
{
System.out.println("服務器異常: " + e);
}
}
}
下面是我們先運行服務端代碼:

這個時候就證明服務端成功啟動!
接着運行客戶端代碼:

此時如果我們看到控制台有服務器返回的數據就代表我們大功告成了!
