Файл: Технология «клиент-сервер» (Общие сведения о программных системах).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 14.03.2024

Просмотров: 36

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Рисунок 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 *)&current_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(&current_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 *)&current_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);

}