В предыдущей главе мы создали образец приложения RMI, в котором клиент вызывает метод, который отображает окно графического интерфейса пользователя (JavaFX).
В этой главе мы рассмотрим пример того, как клиентская программа может извлекать записи из таблицы в базе данных MySQL, находящейся на сервере.
Предположим, у нас есть таблица с именем student_data в деталях базы данных, как показано ниже.
+----+--------+--------+------------+---------------------+ | ID | NAME | BRANCH | PERCENTAGE | EMAIL | +----+--------+--------+------------+---------------------+ | 1 | Ram | IT | 85 | [email protected] | | 2 | Rahim | EEE | 95 | [email protected] | | 3 | Robert | ECE | 90 | [email protected] | +----+--------+--------+------------+---------------------+
Предположим, что имя пользователя myuser, а пароль — пароль .
Создание студенческого класса
Создайте класс Student с методами установки и получения, как показано ниже.
public class Student implements java.io.Serializable { private int id, percent; private String name, branch, email; public int getId() { return id; } public String getName() { return name; } public String getBranch() { return branch; } public int getPercent() { return percent; } public String getEmail() { return email; } public void setID(int id) { this.id = id; } public void setName(String name) { this.name = name; } public void setBranch(String branch) { this.branch = branch; } public void setPercent(int percent) { this.percent = percent; } public void setEmail(String email) { this.email = email; } }
Определение удаленного интерфейса
Определите удаленный интерфейс. Здесь мы определяем удаленный интерфейс с именем Hello, в котором есть метод getStudents () . Этот метод возвращает список, который содержит объект класса Student .
import java.rmi.Remote; import java.rmi.RemoteException; import java.util.*; // Creating Remote interface for our application public interface Hello extends Remote { public List<Student> getStudents() throws Exception; }
Разработка класса реализации
Создайте класс и реализуйте созданный выше интерфейс.
Здесь мы реализуем метод getStudents () интерфейса Remote . Когда вы вызываете этот метод, он получает записи таблицы с именем student_data . Устанавливает эти значения для класса Student с использованием его методов установки, добавляет его в объект списка и возвращает этот список.
import java.sql.*; import java.util.*; // Implementing the remote interface public class ImplExample implements Hello { // Implementing the interface method public List<Student> getStudents() throws Exception { List<Student> list = new ArrayList<Student>(); // JDBC driver name and database URL String JDBC_DRIVER = "com.mysql.jdbc.Driver"; String DB_URL = "jdbc:mysql://localhost:3306/details"; // Database credentials String USER = "myuser"; String PASS = "password"; Connection conn = null; Statement stmt = null; //Register JDBC driver Class.forName("com.mysql.jdbc.Driver"); //Open a connection System.out.println("Connecting to a selected database..."); conn = DriverManager.getConnection(DB_URL, USER, PASS); System.out.println("Connected database successfully..."); //Execute a query System.out.println("Creating statement..."); stmt = conn.createStatement(); String sql = "SELECT * FROM student_data"; ResultSet rs = stmt.executeQuery(sql); //Extract data from result set while(rs.next()) { // Retrieve by column name int id = rs.getInt("id"); String name = rs.getString("name"); String branch = rs.getString("branch"); int percent = rs.getInt("percentage"); String email = rs.getString("email"); // Setting the values Student student = new Student(); student.setID(id); student.setName(name); student.setBranch(branch); student.setPercent(percent); student.setEmail(email); list.add(student); } rs.close(); return list; } }
Серверная программа
Программа сервера RMI должна реализовывать удаленный интерфейс или расширять класс реализации. Здесь мы должны создать удаленный объект и связать его с реестром RMI .
Ниже приводится серверная программа этого приложения. Здесь мы расширим созданный выше класс, создадим удаленный объект и зарегистрируем его в реестре RMI с именем привязки hello .
import java.rmi.registry.Registry; import java.rmi.registry.LocateRegistry; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class Server extends ImplExample { public Server() {} public static void main(String args[]) { try { // Instantiating the implementation class ImplExample obj = new ImplExample(); // Exporting the object of implementation class ( here we are exporting the remote object to the stub) Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0); // Binding the remote object (stub) in the registry Registry registry = LocateRegistry.getRegistry(); registry.bind("Hello", stub); System.err.println("Server ready"); } catch (Exception e) { System.err.println("Server exception: " + e.toString()); e.printStackTrace(); } } }
Клиентская программа
Ниже приведена клиентская программа этого приложения. Здесь мы выбираем удаленный объект и вызываем метод с именем getStudents () . Он извлекает записи таблицы из объекта списка и отображает их.
import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.util.*; public class Client { private Client() {} public static void main(String[] args)throws Exception { try { // Getting the registry Registry registry = LocateRegistry.getRegistry(null); // Looking up the registry for the remote object Hello stub = (Hello) registry.lookup("Hello"); // Calling the remote method using the obtained object List<Student> list = (List)stub.getStudents(); for (Student s:list)v { // System.out.println("bc "+s.getBranch()); System.out.println("ID: " + s.getId()); System.out.println("name: " + s.getName()); System.out.println("branch: " + s.getBranch()); System.out.println("percent: " + s.getPercent()); System.out.println("email: " + s.getEmail()); } // System.out.println(list); } catch (Exception e) { System.err.println("Client exception: " + e.toString()); e.printStackTrace(); } } }
Шаги для запуска примера
Ниже приведены шаги для запуска нашего примера RMI.
Шаг 1 — Откройте папку, в которой вы сохранили все программы, и скомпилируйте все файлы Java, как показано ниже.
Javac *.java
Шаг 2 — Запустите реестр rmi, используя следующую команду.
start rmiregistry
Это запустит реестр rmi в отдельном окне, как показано ниже.
Шаг 3 — Запустите файл класса сервера, как показано ниже.
Java Server
Шаг 4 — Запустите файл класса клиента, как показано ниже.
java Client