Файл: Технология «клиент-сервер» (Общие сведения о программных системах).pdf
Добавлен: 14.03.2024
Просмотров: 48
Скачиваний: 0
СОДЕРЖАНИЕ
ГЛАВА 1. ОБЩИЕ СВЕДЕНИЯ О ПРОГРАММНЫХ СИСТЕМАХ
1.1. Основные понятия и терминология программных систем
1.2. Основные понятия и терминология архитектуры программных систем
1.3. Клиент-серверная архитектура программных систем
1.4. Основные стандарты, регламентирующие порядок межмодульного взаимодействия
ГЛАВА 2. ОСОБЕННОСТИ ОБЛАЧНЫХ СЕРВЕРОВ ПРИЛОЖЕНИЙ
ГЛАВА 3. РАЗРАБОТКА КЛИЕНТ-СЕРВЕРНЫХ ПРИЛОЖЕНИЙ С ИСПОЛЬЗОВАНИЕМ ПРОТОКОЛА UDP
3.3. Использование серверной программы
Рисунок 18 – Запуск программы-сервера.
3.4. Использование клиентской программы
Прежде чем запускать клиентскую программу, необходимо убедиться, что серверная программа запущена на компьютере сервера. Синтаксис для клиента программа timecli адрес_сервера [адрес клиента] порт. Адрес сервера — это адрес компьютера в формате xxx.xxx.xxx.xxx, на котором запущен компьютер сервера. Параметр порт — это порт, на котором запущен сервер. Необязательный параметр адрес клиента переопределяет автоматическое создание локальных адресов для клиентского компьютера и аналогичен приведенной выше серверной программе. Например, чтобы подключиться к серверу с адресом 192.168.1.102, работающему на порту 5000, необходимо ввести timecli 192.168.1.102 5000.
Рисунок 19 – Запуск программы-клиента.
В данном разделе представлена разработка программ, использующих протокол UDP для обмена данными по сети. Программы построены по клиент-серверной архитектуре и обеспечивают передачу данных о системном времени.
ЗАКЛЮЧЕНИЕ
В данной курсовой работе было проведено исследование на тему «Программная архитектура клиент-сервер».
Структура курсовой работы состоит из введения, трех глав, заключения и списка литературы. Также работа содержит приложение с исходными кодами созданных программ.
В первой главе проведен обзор общих понятий о программных системах, классификация их архитектур, вопросы создания.
На сегодняшний день существует довольно большое количество архитектур программных систем. Тем не менее их можно условно разделить на автономные приложения и клиент-серверные приложения. Именно клиент-серверные архитектуры и их модификации составляют основу современной IT индустрии. Использование той или иной их разновидности зависит от конкретных задач, которые решает программная система и бюджета организации, для которой она создается. Наиболее совершенными являются программные системы на основе распределенной архитектуры.
Распределенные архитектуры породили необходимость в новых способах универсальной и простой передачи данных между компьютерами. Наибольшую популярность получил язык разметки XML, благодаря своей простоте и универсальности.
Во второй главе рассматривались вопросы организации облачных сервисов, которые являются одним из подтипов клиент-серверной архитектуры и получили на сегодняшний день значительное распространение.
В третьей главе представлена практическая часть работы. В ней были разработаны демонстрационные программы клиента и сервера, выполняющие обмен данными по сетевому протоколу.
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
1. Мартин, Дж. Вычислительные сети и распределенная обработка данных: программное обеспечение, методы и архитектура / Дж. Мартин. - М.: Финансы и статистика, 1985. - 525 c
2. Поль, М. Дюваль Непрерывная интеграция. Улучшение качества программного обеспечения и снижение риска / Поль М. Дюваль, Стивен Матиас, Эндрю Гловер. - Москва: ИЛ, 2016. - 240 c.
3. Дюваль Непрерывная интеграция. Улучшение качества программного обеспечения и снижение риска / Дюваль, М. Поль. - М.: Вильямс, 2012. - 240 c.
4. Котляров, В. П. Основы тестирования программного обеспечения / В.П. Котляров, Т.В. Коликова. - М.: Интернет-университет информационных технологий, Бином. Лаборатория знаний, 2013. - 288 c.
5. Котляров, В.П. Основы тестирования программного обеспечения / В.П. Котляров. - М.: Интернет-Университет Информационных Технологий (ИНТУИТ), 2015. - 579 c.
6. Абельсон, Х.; Сассман, Дж. Структура и интерпретация компьютерных программ; М.: Добросвет - Москва, 2012. - 608 c.
7. Баррон, Дэвид Введение в языки программирования; М.: Мир - Москва, 2011. - 192 c
8. Ерофеев, В.И.; Меркушов, Ю.П. и др. Средства отладки программ в ОС ЕС; Статистика - Москва, 2012. - 245 c.
9. Зелковиц, М. Принципы разработки программного обеспечения / М. Зелковиц, А. Шоу, Дж. Гэннон. - Москва: РГГУ, 1982. - 364 c.
10. Роббинс, Джон Отладка приложений для Microsoft .NET и Microsoft Windows (+CD-ROM); М.: Microsoft Press. Русская Редакция - Москва, 2015. - 736 c
11. Робинсон, С.; Корнес, О.; Глинн, Д. и др. C# для профессионалов; М.: Лори - Москва, 2012. - 996 c.
12. Семашко, Г.Л.; Салтыков, А.И. Программирование на языке Паскаль; М.: Наука - Москва, 2010. - 128 c.
13. Фролов, А.В.; Фролов, Г.В. Локальные сети персональных компьютеров. Работа с сервером Novell NetWare; Диалог-Мифи - Москва, 2010. - 168 c.
14. Холл, П. Вычислительные структуры: Введение в нечисленное программирование; М.: Мир - Москва, 2010. - 214 c.
15. Иванова Г.С. Основы программирования: Учебник для вузов. - М.: Изд-во МГТУ им. Н.Э. Баумана, 2002. - 416 с.
16. Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. - М.: МЦНМО, 2009. - 960с.
17. Левитин В. Алгоритмы: введение в разработку и анализ.: Пер. с англ. - М.: Вильяме, 2006.
18. Окулов С.М. Основы программирования. - 3-е изд. - М.: БИНОМ. Лаборатория знаний, 2006. - 440с.
19. Орлов С. Технологии разработки программного обеспечения. - СПб.: Питер, 2005
20. Сырецкий Г. Информатика. Фундаментальный курс. Том 1. Основы информационной и вычислительной техники.: БХВ-Петербург, 2005 - 832 с.
Исходный код программы timecli
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <winsock.h>
#define SIZE 500
void usage(void);
int main(int argc, char **argv)
{
WSADATA w;
unsigned short port_number;
SOCKET sd;
int server_length;
char send_buffer[SIZE] = "GET TIME\r\n";
time_t current_time;
struct hostent *hp;
struct sockaddr_in server;
struct sockaddr_in client;
int a1, a2, a3, a4;
int b1, b2, b3, b4;
char host_name[256];
/* Проверяем аргументы командной строки */
if (argc != 3 && argc != 4)
{
usage();
}
if (sscanf(argv[1], "%d.%d.%d.%d", &a1, &a2, &a3, &a4) != 4)
{
usage();
}
if (sscanf(argv[2], "%u", &port_number) != 1)
{
usage();
}
if (argc == 4)
{
if (sscanf(argv[3], "%d.%d.%d.%d", &b1, &b2, &b3, &b4) != 4)
{
usage();
}
}
/* Открываем соединение Windows */
if (WSAStartup(0x0101, &w) != 0)
{
fprintf(stderr, "Could not open Windows connection.\n");
exit(0);
}
/* Открываем сокет */
sd = socket(AF_INET, SOCK_DGRAM, 0);
if (sd == INVALID_SOCKET)
{
fprintf(stderr, "Could not create socket.\n");
WSACleanup();
exit(0);
}
/* Очищаем структуру server */
memset((void *)&server, '\0', sizeof(struct sockaddr_in));
/* Устанавливаем семейство и порт */
server.sin_family = AF_INET;
server.sin_port = htons(port_number);
/* Устанавливаем адрес сервера */
server.sin_addr.S_un.S_un_b.s_b1 = (unsigned char)a1;
server.sin_addr.S_un.S_un_b.s_b2 = (unsigned char)a2;
server.sin_addr.S_un.S_un_b.s_b3 = (unsigned char)a3;
server.sin_addr.S_un.S_un_b.s_b4 = (unsigned char)a4;
/* Очищаем структуру client */
memset((void *)&client, '\0', sizeof(struct sockaddr_in));
/* Устанавливаем семейство и порт */
client.sin_family = AF_INET;
client.sin_port = htons(0);
if (argc == 3)
{
/* Получаем имя компьютера */
gethostname(host_name, sizeof(host_name));
hp = gethostbyname(host_name);
/* Проверяем указатель */
if (hp == NULL)
{
fprintf(stderr, "Could not get host name.\n");
closesocket(sd);
WSACleanup();
exit(0);
}
/* Назначаем адрес */
client.sin_addr.S_un.S_un_b.s_b1 = hp->h_addr_list[0][0];
client.sin_addr.S_un.S_un_b.s_b2 = hp->h_addr_list[0][1];
client.sin_addr.S_un.S_un_b.s_b3 = hp->h_addr_list[0][2];
client.sin_addr.S_un.S_un_b.s_b4 = hp->h_addr_list[0][3];
}
else
{
client.sin_addr.S_un.S_un_b.s_b1 = (unsigned char)b1;
client.sin_addr.S_un.S_un_b.s_b2 = (unsigned char)b2;
client.sin_addr.S_un.S_un_b.s_b3 = (unsigned char)b3;
client.sin_addr.S_un.S_un_b.s_b4 = (unsigned char)b4;
}
/* Привязываем адрес к сокету */
if (bind(sd, (struct sockaddr *)&client, sizeof(struct sockaddr_in)) == -1)
{
fprintf(stderr, "Cannot bind address to socket.\n");
closesocket(sd);
WSACleanup();
exit(0);
}
/* Передаем запрос на получение времени */
server_length = sizeof(struct sockaddr_in);
if (sendto(sd, send_buffer, (int)strlen(send_buffer) + 1, 0, (struct sockaddr *)&server, server_length) == -1)
{
fprintf(stderr, "Error transmitting data.\n");
closesocket(sd);
WSACleanup();
exit(0);
}
/* Получаем время */
if (recvfrom(sd, (char *)¤t_time, (int)sizeof(current_time), 0, (struct sockaddr *)&server, &server_length) < 0)
{
fprintf(stderr, "Error receiving data.\n");
closesocket(sd);
WSACleanup();
exit(0);
}
/* Отображаем время */
printf("Current time: %s", ctime(¤t_time));
closesocket(sd);
WSACleanup();
return 0;
}
void usage(void)
{
fprintf(stderr, "Usage: timecli server_address port [client_address]\n");
exit(0);
}
Исходный код программы timeserv
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock.h>
#include <time.h>
#define BUFFER_SIZE 4096
void usage(void);
int main(int argc, char **argv)
{
WSADATA w; /* Used to open windows connection */
unsigned short port_number;
int a1, a2, a3, a4;
int client_length;
int bytes_received;
SOCKET sd;
struct sockaddr_in server
struct sockaddr_in client;
char buffer[BUFFER_SIZE];
struct hostent *hp;
char host_name[256];
time_t current_time
if (argc == 2)
{
if (sscanf(argv[1], "%u", &port_number) != 1)
{
usage();
}
}
else if (argc == 3)
{
if (sscanf(argv[1], "%d.%d.%d.%d", &a1, &a2, &a3, &a4) != 4)
{
usage();
}
if (sscanf(argv[2], "%u", &port_number) != 1)
{
usage();
}
}
else
{
usage();
}
/* Открытие соединения Windows */
if (WSAStartup(0x0101, &w) != 0)
{
fprintf(stderr, "Could not open Windows connection.\n");
exit(0);
}
/* Открытие сокета */
sd = socket(AF_INET, SOCK_DGRAM, 0);
if (sd == INVALID_SOCKET)
{
fprintf(stderr, "Could not create socket.\n");
WSACleanup();
exit(0);
}
/* Очистка структуры */
memset((void *)&server, '\0', sizeof(struct sockaddr_in));
/* Установка семейства и порта */
server.sin_family = AF_INET;
server.sin_port = htons(port_number);
/* Автоматическая установка адресов при необходимости */
if (argc == 2)
{
/* Получение имени компьютера */
gethostname(host_name, sizeof(host_name));
hp = gethostbyname(host_name);
/* Проверка указателя */
if (hp == NULL)
{
fprintf(stderr, "Could not get host name.\n");
closesocket(sd);
WSACleanup();
exit(0);
}
/* Назначение адресов */
server.sin_addr.S_un.S_un_b.s_b1 = hp->h_addr_list[0][0];
server.sin_addr.S_un.S_un_b.s_b2 = hp->h_addr_list[0][1];
server.sin_addr.S_un.S_un_b.s_b3 = hp->h_addr_list[0][2];
server.sin_addr.S_un.S_un_b.s_b4 = hp->h_addr_list[0][3];
}
/* В противном случае назначаем адреса вручную */
else
{
server.sin_addr.S_un.S_un_b.s_b1 = (unsigned char)a1;
server.sin_addr.S_un.S_un_b.s_b2 = (unsigned char)a2;
server.sin_addr.S_un.S_un_b.s_b3 = (unsigned char)a3;
server.sin_addr.S_un.S_un_b.s_b4 = (unsigned char)a4;
}
/* Присоединение адреса к сокету */
if (bind(sd, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) == -1)
{
fprintf(stderr, "Could not bind name to socket.\n");
closesocket(sd);
WSACleanup();
exit(0);
}
printf("Server running on %u.%u.%u.%u\n", (unsigned char)server.sin_addr.S_un.S_un_b.s_b1,
(unsigned char)server.sin_addr.S_un.S_un_b.s_b2,
(unsigned char)server.sin_addr.S_un.S_un_b.s_b3,
(unsigned char)server.sin_addr.S_un.S_un_b.s_b4);
printf("Press CTRL + C to quit\n");
while (1)
{
client_length = (int)sizeof(struct sockaddr_in);
/* Получение данных от клиента */
bytes_received = recvfrom(sd, buffer, BUFFER_SIZE, 0, (struct sockaddr *)&client, &client_length);
if (bytes_received < 0)
{
fprintf(stderr, "Could not receive datagram.\n");
closesocket(sd);
WSACleanup();
exit(0);
}
/* Проверка запроса времени */
if (strcmp(buffer, "GET TIME\r\n") == 0)
{
/* Получение текущего времени */
current_time = time(NULL);
/* Отправление данных */
if (sendto(sd, (char *)¤t_time, (int)sizeof(current_time), 0, (struct sockaddr *)&client, client_length) != (int)sizeof(current_time))
{
fprintf(stderr, "Error sending datagram.\n");
closesocket(sd);
WSACleanup();
exit(0);
}
}
}
closesocket(sd);
WSACleanup();
return 0;
}
void usage(void)
{
fprintf(stderr, "timeserv [server_address] port\n");
exit(0);
}