Поиск

Полнотекстовый поиск:
Где искать:
везде
только в названии
только в тексте
Выводить:
описание
слова в тексте
только заголовок

Рекомендуем ознакомиться

'Документ'
Обобщены, выделены и проанализированы направления этих исследований. Таких направлений выделено восемь: системно-аналитическое; профориентационное; р...полностью>>
'Диплом'
Управление продажами: разработка конкурентного коммерческого предложения, презентации компании, обучение персонала, дебиторская задолженность (систем...полностью>>
'Документ'
В обстановке переходного периода рубежа 1980-1990-х гг., обострения системного кризиса, повлекшего за собой качественные изменения социальной структу...полностью>>
'Документ'
Положение тела. Тело пловца занимает в воде сравнительно высокое, уравновешенное, вытянутое и почти горизонтальное положение с углом атаки 4-5 градус...полностью>>

Лабораторная работа Создание приложения rmi разработчик Дубаков А. А

Главная > Лабораторная работа
Сохрани ссылку в одной из сетей:

Лабораторная работа 3. Создание приложения RMI

Разработчик Дубаков А.А.

Постановка задачи

Необходимо разработать клиент/серверное приложение для удаленной регистрации участников научной конференции. Сервер организаторов конференции содержит базу данных (БД) и RMI-сервис для приема и записи регистрационных сведений в БД. Участникам конференции предоставляется приложение с графическим интерфейсом для ввода и отсылки данных на сервер с помощью вызова удаленного метода RMI.

Для решения поставленной задачи необходимо выполнить следующие шаги:

      1. Создать новый проект.

      2. Создать в БД таблицу registration_info для хранения данных регистрации участников конференции.

      3. Создать сериализуемый Java-класс RegistrationInfo для представления и передачи данных регистрации.

      4. Реализовать интерфейс ConfServer и класс реализации ConfServerImpl удаленных методов сервера.

      5. Создать клиентское приложение – разработать графический интерфейс (Swing) и обеспечить вызов удаленного метода сервера.

      6. Выполнить приложение.

Подготовительный этап

Для реализации проекта необходимо установить и настроить среду разработки Ecplise, Apache Derby и Derby Plugins (см. п. «Установка и настройка программного обеспечения»).

Создание нового проекта

  1. Выберите пункт меню File/New/Project, в окне выбора типа проекта укажите other/Java Project и нажмите Next

  2. Укажите имя проекта Lab3 и нажмите Finish.

Создание таблицы registration_info

  1. Подключитесь к БД Derby и запустите сервер БД (см. п. «Установка и настройка программного обеспечения», пп. 8 «Запуск и остановка Apache Derby»).

  2. Для хранения SQL-скриптов создадим новый файл registration_info.sql. В окне Package Explorer щелкните правой кнопкой мыши на значок проекта и выберите New/File, укажите имя файла registration_info.sql и нажмите Finish.

  3. Скопируйте в файл следующие команды:

-- подключение

connect 'jdbc:derby://localhost:1527/myDB;create=true;user=me;password=mine';

-- создание таблицы

create table registration_info(first_name varchar(20), last_name varchar(20), organization varchar(100), report_theme varchar(300), email varchar(20));

-- отключение и выход

disconnect;

exit;

  1. Сохраните файл нажатием на Ctrl-S

  2. Щелкните правой кнопкой мыши на файл registration_info.sql в окне Package Explorer и выберите Apache Derby/Run SQL Script using ‘ij’

  3. В случае успешного выполнения скрипта в консоли выводится следующее:

ij version 10.3

ij> -- подключение

connect 'jdbc:derby://localhost:1527/myDB;create=true;user=me;password=mine';

ij> -- создание таблицы

create table registration_info(first_name varchar(20), last_name varchar(20), organization varchar(100), report_theme varchar(300), email varchar(20));

0 rows inserted/updated/deleted

Создание класса RegistrationInfo

Перед тем как начать создание интерфейса и класса реализации, создадим обычный сериализуемый Java-класс RegistrationInfo, который будет использоваться для представления и передачи данных об участнике конференции.

    1. Создайте новый Java-класс, нажав правой кнопкой мыши на каталог src и выбрав пункт меню New/Class. Назовите класс RegistrationInfo и разместите его в пакете ru.tpu.javaEElabs.lab3.

    2. В классе Employee создайте пять полей, соответствующих столбцам таблицы registration_info, добавьте конструкторы и набор get/set методов. Полный код класса RegistrationInfo приведен ниже:

package ru.tpu.javaEElabs.lab3;

import java.io.Serializable;

public class RegistrationInfo implements Serializable {

private String firstName;

private String lastName;

private String organization;

private String reportTheme;

private String email;

public RegistrationInfo() {}

public RegistrationInfo(String firstName, String lastName,

String organization, String reportTheme, String email) {

super();

this.firstName = firstName;

this.lastName = lastName;

anization = organization;

this.reportTheme = reportTheme;

this.email = email;

}

public String getFirstName() {

return firstName;

}

public void setFirstName(String firstName) {

this.firstName = firstName;

}

public String getLastName() {

return lastName;

}

public void setLastName(String lastName) {

this.lastName = lastName;

}

public String getOrganization() {

return organization;

}

public void setOrganization(String organization) {

anization = organization;

}

public String getReportTheme() {

return reportTheme;

}

public void setReportTheme(String reportTheme) {

this.reportTheme = reportTheme;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

}

Создание интерфейса ConfServer и класса реализации ConfServerImpl

Интерфейс ConfServer объявляет удаленные методы, которые могут быть вызваны клиентом RMI. В нашем случае интерфейс будет содержать один метод registerConfParticipant, принимающий характеристики участника конференции, и сохраняющий их в БД.

  1. Для создания нового интерфейса щелкните правой кнопкой мыши на пакет ru.tpu.javaEElabs.lab3 в окне Package Explorer и выберите New/Interface/

  2. В появившемся окне в качестве имени класса (Name) задайте ConfServer и убедитесь что в качестве имени пакета (Package) указано ru.tpu.javaEELabs.lab3. Нажмите Finish.

Код интерфейса ConfServer приведен ниже:

package ru.tpu.javaEElabs.lab3;

import java.rmi.*;

public interface ConfServer extends Remote {

int registerConfParticipant(RegistrationInfo registrationInfo)

throws RemoteException;

}

Создание класса реализации ConfServerImpl

Класс ConfServerImpl содержит реализацию удаленного метода регистрации участников концференции. Объект класса ConfServerImpl представляет собой удаленный сервис и должен быть зарегистрирован под определенным именем в регистре RMI, входящем в состав Java Virtual Machine и запускаемый командой rmiregitry. Регистр RMI, обеспечивает хранение, поиск и выполнение методов объекта удаленными клиентами.

Перед регистрацией объекта в регистре RMI необходимо во-первых, указать путь к откомпилированному классу реализации ConfServerImpl (каталог bin в каталоге проекта). Во-вторых, необходимо настроить параметры менеджера безопасности (security manager), таким образом, чтобы виртуальная машина сервера могла запускать код объектов, пришедших (например, по сети) в качестве аргументов вызова удаленных методов. Эти настройки могут быть указаны с помощью файлов конфигурации, параметров запуска приложения, либо в самом коде метода. В приведенном ниже примере используется последний способ.

Создание класса ConfServerImpl включает в себя следующие основные задачи:

        1. Реализацию интерфейса ConfServerImpl.

        2. Создание конструктора.

        3. Обеспечение реализации удаленного метода registerConfParticipant.

        4. Создание метода main(), выполняемого при запуске сервера, где выполняется:

- указание регистру RMI пути к файлу класса реализации сервера путем установки значения системного свойства java.rmi.server.codebase;

- создание и настройка менеджера безопасности RMISecurityManager;

- создание и регистрация в регистре RMI удаленного объекта ConfServer.

  1. Для создания класса щелкните правой кнопкой мыши на пакет ru.tpu.javaEELabs.lab3 в каталоге src окна Package Explorer и выберите New/Class.

  2. В появившемся окне в качестве имени класса (Name) задайте ConfServerImpl. Нажмите Finish.

Код класса ConfServerImpl приведен ниже:

package ru.tpu.javaEElabs.lab3;

import java.rmi.*;

import java.rmi.server.UnicastRemoteObject;

import java.security.Permission;

import java.sql.*;

public class ConfServerImpl extends UnicastRemoteObject

implements ConfServer {

/* Определяется конструктор по умолчанию */

public ConfServerImpl() throws RemoteException {

super();

}

/* Определение удаленного метода */

public int registerConfParticipant(RegistrationInfo

registrationInfo) throws RemoteException {

try {

// Регистрация драйвера БД Derby

Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();

// Получение соединения с БД

Connection con = DriverManager.getConnection(

"jdbc:derby://localhost:1527/myDB;create=true;user=me;password=mine");

// Запись полученных данных в БД

PreparedStatement st = con.prepareStatement(

"insert into registration_info " +

"(first_name, last_name, organization, " +

"report_theme, email) " +

"values (?, ?, ?, ?, ?)");

st.setString(1, registrationInfo.getFirstName());

st.setString(2, registrationInfo.getLastName());

st.setString(3, registrationInfo.getOrganization());

st.setString(4, registrationInfo.getReportTheme());

st.setString(5, registrationInfo.getEmail());

st.executeUpdate();

st.close();

// Получение количества зарегистрированных участников

Statement st1 = con.createStatement();

int count = 0;

ResultSet rs = st1.executeQuery(

"Select count(*) from registration_info");

if (rs.next()) {

count = rs.getInt(1);

}

st1.close();

return count;

} catch (Exception e) {

e.printStackTrace();

throw new RemoteException(e.getMessage(), e);

}

}

/* Метода main() */

public static void main(String args[]) {

try {

// Указание расположения классов RMI

System.setProperty("java.rmi.server.codebase",

"file:///D:/JavaEE-Workbook/labs-workspace/Lab3_RMI/bin/");

// Установка менеджера безопасности (если не установлен):

// Создается новый объект анонимного

//класса RMISecurityManager

// и переопределяется метод checkPermission.

// Метод не содержит кода, следовательно, не определяет

// никаких ограничений

if (System.getSecurityManager() == null) {

System.setSecurityManager(new RMISecurityManager() {

public void checkConnect(String host, int port,

Object context) {}

public void checkConnect(String host, int port) {}

public void checkPermission(Permission perm) {}

});

}

// Создание экземпляра класса ConfServerImpl

ConfServerImpl instance = new ConfServerImpl();

// Регистрация объекта RMI под именем ConfServer

Naming.rebind("ConfServer", instance);

System.out.println("Сервис зарегистрирован");

} catch (Exception e) {

e.printStackTrace();

}

}

}

Создание клиента

Класс ConfClient обращается к удаленному хосту (в нашем примере localhost) и получает ссылку на удаленный объект из регистра RMI. После этого клиент получает возможность вызова удаленных методов.

  1. Щелкните правой кнопкой мыши на пакет ru.tpu.javaEELabs.lab3 в каталоге src окна Package Explorer и выберите New/Class.

  2. В появившемся окне в качестве имени класса (Name) задайте ConfClient. Нажмите Finish.

Код класса ConfClient приведен ниже:

package ru.tpu.javaEElabs.lab3;

import javax.swing.*;

import java.rmi.*;

import java.awt.event.*;

import java.awt.*;

public class ConfClient {

/* Объявляются переменные */

static JFrame frame;

static JPanel panel;

JLabel lbLastName;

JLabel lbFirstName;

JLabel lbOrganization;

JLabel lbReportTheme;

JLabel lbEmail;

JTextField txtLastName;

JTextField txtFirstName;

JTextField txtOrganization;

JTextField txtReportTheme;

JTextField txtEmail;

JButton submit;

/* Определяется конструктор по умолчанию */

public ConfClient() {

/* Создается JFrame */

frame = new JFrame("Регистрация участника конференции");

panel = new JPanel();

/* Набор менеджеров разметки */

panel.setLayout(new GridLayout(5, 2));

frame.setBounds(100, 100, 400, 200);

frame.getContentPane().setLayout(new BorderLayout());

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

/* Define the swing components on the JFrame */

lbLastName = new JLabel("Фамилия");

lbFirstName = new JLabel("Имя");

lbReportTheme = new JLabel("Тема доклада");

lbOrganization = new JLabel("Организация");

lbEmail = new JLabel("Емайл");

txtLastName = new JTextField(15);

txtFirstName = new JTextField(15);

txtOrganization = new JTextField(70);

txtReportTheme = new JTextField(100);

txtEmail = new JTextField(15);

submit = new JButton("Отправить");

/* Добавление в панель компонентов swing */

panel.add(lbLastName);

panel.add(txtLastName);

panel.add(lbFirstName);

panel.add(txtFirstName);

panel.add(lbOrganization);

panel.add(txtOrganization);

panel.add(lbReportTheme);

panel.add(txtReportTheme);

panel.add(lbEmail);

panel.add(txtEmail);

frame.getContentPane().add(panel, BorderLayout.CENTER);

frame.getContentPane().add(submit, BorderLayout.SOUTH);

frame.setVisible(true);

submit.addActionListener(new ButtonListener());

}

/* Создание класса ButtonListener */

class ButtonListener implements ActionListener {

/* Определение метода actionPerformed() */

public void actionPerformed(ActionEvent evt) {

try {

// Получение удаленного объекта

// Если сервер размещен на удаленном компьютере,

// то вместо localhost указывается имя

// хоста сервера

ConfServer server = (ConfServer) Naming.lookup(

"rmi://localhost/ConfServer");

// Формирование сведений о регистрации для

//отправки на сервер

RegistrationInfo registrationInfo =

new RegistrationInfo(

txtFirstName.getText(),

txtLastName.getText(),

txtOrganization.getText(),

txtReportTheme.getText(),

txtEmail.getText());

// Вызов удаленного метода

int count = server.

registerConfParticipant(registrationInfo);

JOptionPane.showMessageDialog(frame,

"Регистрация выполнена успешно" +

"\nКоличество зарегистрированных участников - " +

count +

"\nСпасибо за участие");

} catch (Exception e) {

JOptionPane.showMessageDialog(frame, "Ошибка");

System.out.println(e);

}

}

}

// Определение метода main()

public static void main(String args[]) {

// Создание объекта класса Client

new ConfClient();

}

}

Запуск и тестирование

Каждый из классов ConfServerImpl и ConfClient содержит метод main() и является независимым приложением, которое может быть запущено на отдельном компьютере. В нашем случае роль клиента и сервера будет выполнять один и тот же компьютер.

  1. Запустите службу регистра RMI с помощью команды rmiregistry. В Windows это действие может быть выполнено с помощью команды Пуск/Выполнить. Служба регистра RMI обеспечивает хранение удаленных объектов и доступ к ним клиентов и должна быть запущена на протяжении всего времени работы приложений с удаленными объектами.

  2. Щелкните правой кнопкой мыши на класс ConfServerImpl в окне Package Explorer и выберите команду Run As/Java Application. В результате выполнения в службе RMI регистрируется объект ConfServer. В случае успешной регистрации выводится сообщение:

  1. Аналогичным образом запустите класс ConfClient. В появившемся окне укажите данные регистрации нового участника и нажмите Отправить. Результаты успешного выполнения программы приведены на следующем рисунке:

  1. Проверим появилась ли запись о новом участнике в таблице БД registration_info. Для этого откройте файл registration_info.sql, закоментируйте строку create table registration_info и добавьте следующий запрос:

select * from registration_info

  1. Выполните скрипт и просмотрите результаты Select-запроса:

Варианты заданий

1. На удаленном сервере хранится база данных документов. Необходимо разработать клиент/серверное приложение для обеспечения возможности поиска и загрузки документов. Каждый документ описывается в виде набора следующих атрибутов: название, дата создания, автор, путь к файлу. Пользователь должен иметь возможность просмотра списка документов, и загрузки необходимого файла документа на свой компьютер. Обеспечить графический интерфейс для клиентского приложения. Рекомендация: содержимое файла можно передавать в виде массива байт (byte[]).

2. На удаленном сервере хранится база данных изображений. Необходимо разработать клиент/серверное приложение для обеспечения возможности их просмотра. Каждое изображение представляет собой файл на сервере и описывается с помощью следующих атрибутов: краткое описание, дата создания, автор, путь к файлу. Пользователь должен иметь возможность просмотра списка изображений, и просмотра выбранного изображения на своем компьютере. Обеспечить графический интерфейс для клиентского приложения. Рекомендация: содержимое файла можно передавать в виде массива байт (byte[]).



Скачать документ

Похожие документы:

  1. Лабораторная работа №2 Знакомство с операционными системами семейства *nix на примере ос alt linux Server

    Лабораторная работа
    Каждый имеет право воспроизводить, распространять и/или вносить изменения в настоящий Документ в соответствии с условиями GNU Free Documentation License, Версией 1.
  2. Лабораторная работа №1 (6)

    Лабораторная работа
    Лабораторная работа № 1 1. Теоретическая часть: Состав вычислительной системы 1.1. Аппаратное обеспечение Состав вычислительной системы называется конфигурацией.
  3. Лабораторная работа №1 (5)

    Лабораторная работа
    Строку меню, которая содержит как общие для различных приложений пункты такие как Файл, Правка,…, Окно, Справка, так и специфические Проект, Компонент,
  4. Методические указания к проведению лабораторных работ. Специальность 23. 01. 02 «Автоматизированные системы обработки информации и управления»

    Методические указания
    Настоящие методические указания предназначены для оказания методической помощи студентам 4-го курса при выполнении лабораторных работ по курсу «Сети ЭВМ и телекоммуникации»
  5. Методические указания к выполнению лабораторной работы для студентов дневной формы обучения специальности 230201 «Информационные системы и технологии» Брянск 2007

    Методические указания
    Проектирование систем с использованием SADT-методологии. Методические указания к выполнению лабораторной работы для студентов дневной формы обучения специальности 230201 – «Информационные системы и технологии».

Другие похожие документы..