Разработка программы клиент-сервер
Оглавление
ВВЕДЕНИЕ
Когда-то компьютеры были очень громоздкими, и их было очень мало, а на один большой компьютер приходилось много пользователей с еще большим числом очень маленьких задач, вопрос о перенесении программ и данных с одного компьютера на другой не играл какой-либо заметной роли.
Однако по мере совершенствования компьютеров, увеличения их числа, развития и усложнения средств программного обеспечения, в том числе и прикладного, увеличения объемов баз данных возникла насущная необходимость в соединении компьютеров между собой. Такое связывание компьютеров, позволяющее объединить их ресурсы - процессоры, память (внутреннюю и внешнюю, включая жесткие диски, разнообразные внешние устройства - принтеры, факс-аппараты, модемы и др.), каналы связи, и представляет собой вычислительную сеть, в которой каждый компьютер может передать другому компьютеру, подключенному к сети, любой набор данных.
Таким образом, вычислительная сеть, объединяющая ресурсы нескольких компьютеров, позволяет каждому из них использовать всю совокупность этих ресурсов.
Вычислительные сети строятся на основе архитектуры "клиент-сервер", которая предполагает выделение в сети так называемых "серверов" и "клиентов". К клиентам относятся рабочие станции (компьютеры) сети, которые не имеют непосредственных контактов друг с другом и могут общаться между собой только через сервер: следовательно, одна станция не может использовать файл, находящийся на другой станции: для этого файл должен находиться на файл-сервере. Серверы управляют подключенными к ним общими разделяемыми ресурсами сети. В качестве сервера может быть использован либо обычный персональный компьютер, или же это может быть специализированное устройство.
На протяжении последних десяти лет специалисты по вычислительной технике работают над усовершенствованием приложений клиент-сервер. В результате были построены приложения, поддерживающие совместную работу множества пользователей с единственным источником данных в сети.
Архитектура
клиент-сервер стала
В ходе выполнения курсового проекта необходимо изучить архитектуру клиент-сервер, организацию взаимодействия между клиентом и сервером и разработать программное обеспечение, представляющее собой удаленный генератор псевдослучайных последовательностей.
ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
Согласно онлайновому словарю компьютерных терминов, клиент-сервер - это вид распределенной системы, в которой есть сервер, выполняющий запросы клиента, причем сервер и клиент общаются между собой с использованием того или иного протокола.
Под клиентом понимается программа, использующая ресурсы, а под сервером (по английски - слуга) программа, обслуживающая запросы клиентов на получение ресурсов определенного вида. Столь широкое определение включает в себя практически любую программную технологию, в которой участвуют больше одной программы, функции между которыми распределены асимметрично. Соответственно, говорят о технологии КС применителько к операционным системам, локальным и глобальным сетям и т. д.
Такое широкое определение рождает некоторую путаницу. Так, файл-серверная система тоже использует технологию клиент-сервер, однако с точки зрения архитектуры прикладных программ важным является то, какого рода ресурсы сервер предоставляет клиентам.
Понятие архитектуры клиент-сервер в системах управления предприятием связано с делением любой прикладной программы на три основных компонента или слоя. Этими тремя компонентами являются:
компонент представления (визуализации) данных;
компонент прикладной логики;
компонент управления базой данных.
Действительно, любая программа, компьютеризирующая выполнение той или иной прикладной задачи, должна обмениваться информацией с пользователем, осуществлять собственно обработку этой информации в рамках автоматизации того или иного бизнес-процесса, и, наконец, хранить данные используемые в программе, на том или ином постоянном носителе.Для локальных приложений, полностью работающих на ПЭВМ (например, Word или Excel), все эти компоненты собраны вместе и не могут быть распределены между различными компьютеры. Такая программа является монолитной и использует для выполнения ресурсы только того компьютера, на котором выполняется.
В файл-серверных приложениях часть компоненты хранения переносится на файловый сервер, однако, все манипуляции со структурами данных выполняются на клиентской машине, и код пользовательской программы тоже работает только на ней.Критерием, позволяющим отнести прикладную программы к архитектуре клиент-сервер является то, что хотя бы один из трех ее компонентов полностью выполняется на другом компьютере, и взаимодействие между компонентами на разных компьютерах осуществляется через ту или иную сетевую среду посредством передачи запросов на получение того или иного ресурса.
Различие между сервером и клиентом существенно только тогда, когда клиент пытается подключиться к серверу. Как только они соединятся, происходит процесс двухстороннего общения и не важно, что один является сервером, а другой - клиентом.
Итак, работа сервера - слушать соединение, и это выполняется с помощью специального создаваемого серверного объекта (сокета), который равен: сокет = IP + номер_порта. Работа клиента - попытаться создать соединение с сервером, что выполняется с помощью специального клиентского объекта (сокета). Как только соединение установлено, соединение превращается в потоковый объект ввода/вывода, и с этого момента можно рассматривать соединение как файл, который Вы можете читать, и в который Вы можете записывать данные. Единственная особенность, файл может обладать определенным интеллектом и обрабатывать передаваемые Вами команды.
Сокет(гнездо, разъем) (сокет=IP+ПОРТ) - это программная абстракция, используемая для представления “терминалов” соединений между двумя машинами. Для такого соединения, существует сокет на каждой машине, и можно представить себе виртуальный “кабель” соединяющий две машины, каждый конец которого вставлен в сокет.
Как известно в операционной системе Windows связь между разными процессами производится при помощи сокетов (Sockets). Соединяя вместе два сокета, можно передавать данные между разными процессами (локальными и удаленными). Реализация сокетов обеспечивает инкапсуляцию протоколов сетевого и транспортного уровней. Интерфейс , используемый при этом взаимодействии, называется Sockets API. Он представлен библиотекой WinSock и java.net.*.
ОСНОВНАЯ ЧАСТЬ
1Постановка задачи
Разработать клиент серверное-приложение на основе TCP\IP соединения.
Организовать работу удаленного генератора псевдослучайных последовательностей. Функции в программе: одно целое число в диапазоне, массив чисел в диапазоне.
После подключения
к серверу клиента у
После подключения клиента к серверу,пользователь указывает диапазон значений и их количество и посылает серверу запросы псевдослучайных последовательностей. Сервер принимает значения, обрабатывает и отправляет обратно готовый результат.
Работа была выполнена на языке программирования JAVA в среде разработки Eclipse.
В работе используются библиотека java.net.*; разработанная компанией Sun, которая упрощает разработку по технологии клиент – сервер.
2Моделирование и реализация ПО
2.1 АрхитектураПО
Приложениереализовано по технологии клиент-сервер с использованием сокетов Windows, соответственно разрабатываются приложения: клиента и сервера. Приложение «Сервер» запускается в одном экземпляре и выполняет прослушивание заданного порта на предмет подключения клиента. После запроса на подключение сервер устанавливает соединение с клиентом и обрабатывает его запросы. Приложение «Клиент» может быть запущено в нескольких экземплярах.Клиенты подключаются к серверу и посылаютему запросы псевдослучайных последовательностей.Принятые от сервера последовательности отображаются в главном окне. Схема работы программного обеспечения представлена на рисунке 1.
запрос числа
Рис.1
2.2 Описание основных функциональных модулей
Функциональный модуль «Клиент».
Модуль предоставляет текстовый интерфейс для взаимодействия с пользователем. Позволяет выбрать порт сервера, к которому необходимо подключаться для запроса псевдослучайных последовательностей. Также в главном окне модуля есть возможность выбрать тип запроса: одно число или массив чисел, границы для случайных чисел и их количество.
Функциональный модуль «Сервер».
Модуль отвечает за установление соединения с каждым новым клиентом. После соединения с клиентом модуль принимает запрос от клиента, после чего он выполняет запрошенную функцию (генерацию одного или массива псевдослучайных чисел) и возвращает клиенту полученные числа.
2.2.1 Интерфейс пользователя
Для взаимодействия с пользователем в приложении используется оконный интерфейс. В текстовом, консольном режиме.
Главное меню приложения клиента на рисунке 2.
Рис.2
Нужное меню выбирает от 1 до 4. Номер функции отправляется серверу, он обрабатывает ее и высылает результат клиенту.
2.2.2. Прикладной компонент
В данном программном
обеспечении прикладной функцией является
генерация псевдослучайной
2.2.3. Организация сетевого взаимодействия
Сетевое взаимодействие происходит посредством передачи и приема данных через сокеты, связывающие клиента и сервера. После установления соединения с сервером клиент по запросу пользователя передает запрос последовательности чисел. Формат запроса приведен ниже:
Ввод последовательности ->запись в переменные на сервере.
Выбор нужного действия -> передача нужной функции на сервер ->ответ от сервера.
2.3. Реализация ПО
Алгоритм программы клиента рисунок 4.
Рисунок 4
Алгоритм программы сервера рисунок 5.
Рисунок 5
Работа с сокетами представлена классами ServerSocket. Класс, используемый сервером, чтобы “слушать” входящие соединения и Socket- используемый клиентом для инициирования соединения. Как только клиент создает соединение по сокету, ServerSocket возвращает ему с помощью метода accept()соответствующий объект Socket на сервере, по которому будет происходить связь со стороны сервера. Начиная с этого момента, появляется соединение Socket к Socket, и можно считать эти соединения одинаковыми, т.к. они действительно одинаковые.
3Руководство пользователя
Для удобства пользователю предоставляется русскоязычное меню. Нужно выбрать нужный вариант из списка и следовать дальнейшему меню.
Вводить параметры для запроса последовательности псевдослучайных чисел и
нажимать кнопку «Enter». В окне должны отображаться получаемые от сервера псевдослучайные числа.
ЗАКЛЮЧЕНИЕ
В ходе выполнения курсовой работы были созданы приложения клиента и сервера, демонстрирующие использование технологии «клиент-сервер» на примере удаленного генератора псевдослучайных последовательностей.
Программа написана на языке Java в среде программированияEclipse. Тестирование показало правильность работы приложения. Разработка и тестирование производились в ОС Windows 7.
Программа представляет собой удобный пользовательский интерфейс, интуитивно понятный для любого пользователя, программе не требуется установка.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Шилдт, Герберт. Полный справочник поJava, 7-е издание.: Пер. с аннгл. – М.: Издательский дом «Вильямс», 2012.
3. Камалян А.К., Кулев С.А., Назаренко К.Н. и др. Компьютерные сети и средства защиты информации: Учебное пособие /Камалян А.К., Кулев С.А., Назаренко К.Н. и др. - Воронеж: ВГАУ, 2003.
5. Б. Страуструп. «Язык программирования java Специальное издание.», 2009 г.
6. Компьютерные сети: Учебный курсJDK7 – М.: Издательский отдел «Русская редакция», 1999.
ПРИЛОЖЕНИЕ
Сервер
import java.io.*;
import java.net.*;
public class Server
{
privateint min;
privateint max;
privateint mas[];
privateintgenerateNumber;
public static ServerSocketsSocket = null;
public static Socket cAccepted = null;
public static ObjectInputStream Input = null;
public static ObjectOutputStream Output = null;
publicintgetIndexMas(int index)
{
return mas[index];
}
public void setMin(int min)
{
this.min = min;
}
public void setMax(int max)
{
this.max = max;
}
publicintgetGenerateNumber()
{
returngenerateNumber;
}
publicvoidgenerateNumber()
// Функция для генерации
случайной последовательности
{
generateNumber = (int)((double)Math.random() / 1 * (max+1 - min) + min);
}
publicvoidgenerateNumberMas(
// Функция создающая массив определенной длинны и инициализирующая его значения в заданном диапазоне
{
mas = new int[size];
for(inti = 0; i<mas.length; i++)
mas[i] = (int)((double)Math.random() / 1 * (max+1 - min) + min);
}
public static void main(String[] arg) throws IOException
{
Server obj = new Server();
try{
System.out.println("Старт");
sSocket = new ServerSocket(1719);
// Создание сокета сервера для заданного порта
cAccepted = sSocket.accept();
// Выполнение метода,
который обеспечивает
System.out.println("Клиент подключился\n\n");
Input = new ObjectInputStream(cAccepted.
// Создаемпотокввода
Output = new ObjectOutputStream(cAccepted.
// Создаемпотоквывода
while(true)
{
int c = (Integer)Input.readObject();
switch(c)
{
case 1 :
{
// Принимаем от пользователя минимальный и максимальный диапазоны
obj.setMin((Integer)Input.
obj.setMax((Integer)Input.
break;
}
case 2 :
{
// Генерируем число в заданном диапазоне
obj.generateNumber();
Output.writeObject(obj.
break;
}
case 3 :
{
// Генерируем и отправляем массив
int size = (Integer)Input.readObject();
obj.generateNumberMas(size);
for(inti = 0; i< size; i++)
{
Output.writeObject(obj.
}
break;
}
case 4 :
{
Input.close(); // Закрываетсяпотокввода
Output.close(); // Закрывается поток вывода
cAccepted.close(); // Закрывается сокет
sSocket.close(); // Происходит отключение сервера от клиента
System.out.println("Клиент отключился");
return;
}
}
}
} catch(Exception e)
{
}
finally{
try
{
Input.close(); // Закрывается поток ввода
Output.close(); // Закрывается поток вывода
cAccepted.close(); // Закрывается сокет
sSocket.close(); // Происходит отключение сервера от клиента
} catch(Exception e) {
e.printStackTrace(); // Вызывается метод исключения е
}
}
}
}
Клиент:
import java.io.*;
import java.net.*;
importjava.util.*; // Пакет для работы с сокетами
public class Client
{
private static Scanner sc = new Scanner(System.in);
// sc - объект для считывания с клавиатуры
privatestaticSocketcSocket;
// Сокет через которыйсоединяемся с сервером
privateintgenerateNumber;
public void setGenerateNumber(
{
this.generateNumber = generateNumber;
}
publicintgetGenerateNumber()
{
returngenerateNumber;
}
public static void main(String[] arg)
{
Client obj = new Client();
try
{
System.out.println("Выполняю
cSocket = new Socket("127.0.0.1",1719);
System.out.println("Установлен
ObjectOutputStream c =
newObjectOutputStream(cSocket.
// Созданиепотокавывода
ObjectInputStream s =
newObjectInputStream(cSocket.
// Созданиепотокаввода
int da;
do
{
do
{
System.out.println("\
System.out.println("
System.out.println("
System.out.println("
System.out.print("Ввод: ");
da = sc.nextInt();
}while( da>4 || da<1 );
c.writeObject(da);
switch(da)
{
case 1 :
System.out.print("\nВведитемин
intmin = sc.nextInt();
c.writeObject(min);
// Отправляем сервер минимальное число из диапазона
System.out.print("Введите максимальное: ");
intmax = sc.nextInt();
c.writeObject(max);
// Отправляем сервер
максимальное число из
break;
case 2 :
obj.setGenerateNumber((
// Принимаем от сервера сгенерированное число
System.out.println("Ответ от сервера: "+obj.getGenerateNumber()); // Выводим число на экран
break;
case 3 :
System.out.print("Введите размерность массива: ");
intsize = sc.nextInt();
c.writeObject(size);
// Отправляем серверу
размер массива, который он
должен создать, а потом
int mas[] = new int[size];
System.out.println("Ответ от
for(int i = 0; i <size; i++)
// Принимаем от севера по одному символу из массива.
{
mas[i] = (Integer)s.readObject();
System.out.print(mas[i]+" ");
}
System.out.println();
break;
case 4:
{
c.close(); // Закрывается поток ввода
c.close(); // Закрывается поток вывода
cSocket.close(); // Закрываем сокет
return;
}
default : break;
}
}while(true);
}
catch(Exception e) {
e.printStackTrace();
}
}
}