Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

OS_LR3 (сервак)

.docx
Скачиваний:
3
Добавлен:
07.06.2021
Размер:
70.46 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

Калужский филиал федерального государственного бюджетного образовательного учреждения высшего образования

«Московский государственный технический университет имени Н.Э. Баумана (национальный исследовательский университет)»

(КФ МГТУ им. Н.Э. Баумана)

ФАКУЛЬТЕТ _ИУК «Информатика и управление»

КАФЕДРА ИУК6 «Защита информации»

ЛАБОРАТОРНАЯ РАБОТА № 3

«Разработка клиент-серверных приложений на языке Python»

_

ДИСЦИПЛИНА: «Операционные системы»

Выполнил: студент гр. ИУК6-_

_________________ (_______________)

(Подпись) (Ф.И.О.)

Проверил:

_________________ (______________)

(Подпись) (Ф.И.О.)

Дата сдачи (защиты):

Результаты сдачи (защиты):

- Балльная оценка:

- Оценка:

Калуга, 2021

Цель работы: сформировать навыки разработки клиентских и серверных приложений на языке программирования Python.

Задачи: изучить технологию клиент-серверного программного общения. Разработать в соответствии с вариантом клиент-серверное приложение на языке программирования Python.

Теоретические сведения

Под web-приложением будет пониматься программа, основной интерфейс пользователя которой работает в стандартном WWW-браузере под управлением HTML и XML-документов. Для улучшения качества интерфейса пользователя часто применяют JavaScript. Следует заметить, что интерфейс можно построить на Java- или Flash-апплетах, однако, такие приложения сложно назвать webприложениями, так как Java или Flash могут использовать собственные протоколы для общения с сервером, а не стандартный для WWW протокол HTTP. CGI-сценарии Классический путь создания приложений для WWW - написание CGI-сценариев (иногда говорят - скриптов). CGI (Common Gateway Interface, общий шлюзовой интерфейс) – это стандарт, регламентирующий взаимодействие сервера с внешними приложениями. В случае с WWW, web-сервер может направить запрос на генерацию страницы по определенному сценарию. Этот сценарий, получив на вход данные от web-сервера (тот, в свою очередь, мог получить их от пользователя), генерирует готовый объект (изображение, аудиоданные, таблицу стилей и т.п.). При вызове сценария Web-сервер передает ему информацию через стандартный ввод, переменные окружения. Два основных метода передачи данных из заполненной в браузере формы Webсерверу (и CGI-сценарию) - GET и POST. В зависимости от метода данные передаются по-разному. В первом случае они кодируются и помещаются прямо в URL, например: http://example.com/cgi-bin/a.cgi?a=1&b=3. Сценарий получает их в переменной окружения с именем QUERY_STRING. В случае метода POST они передаются на стандартный ввод. Для корректной работы сценарии помещаются в предназначенный для этого каталог на web-сервере (обычно он называется cgi-bin ) или, если это разрешено конфигурацией сервера, в любом месте среди документов HTML. Сценарий должен иметь признак исполняемости. В системе Unix его можно установить с помощью команды chmod a+x.

Выполнение работы

Задание: разработайте приложение-сервер, ведущее список соединений с различных адресов, в котором для каждого адреса клиента хранится число байт, переданное серверу от клиента и число соединений с данного адреса. При соединении клиенту передается информация о соединениях с ним. Протестируйте работу сервера с помощью приложения telnet.

Листинг программы для сервера:

import socket

import threading

import sys

s = socket.socket(

socket.AF_INET,

socket.SOCK_STREAM,

)

s.bind(

("localhost", 1225)

)

s.listen(5)

print(" Server is alive")

users = []

u_addr = []

u_b = []

u_n = []

c_c = []

def listen_u(user, addr):

print("Sound on :P")

x = 0 # first message

z = 0 # poryadok v massive

n = 0 # if no name

while True:

data = user.recv(4096)

ud = data.decode("utf-8")

x += 1

if x == 1:

for i in u_n:

if ud == i:

n += 1

c_c[z] += 1

break

else:

z += 1

if n == 0:

u_b.append(0)

c_c.append(1)

u_n.append(ud)

#user.send("Numb of connections: ".encode("utf-8") + c_c)

if x != 1:

u_b[z] += sys.getsizeof(ud)

print(f"User {u_n[z]} sent: {ud}")

else:

user.send(f"Количество подключений: {c_c[z]}".encode("utf-8"))

if ud == "Bye":

user.send("Bye".encode("utf-8"))

print(u_n + c_c + u_b)

break

def start_serv():

while True:

u_sock, addr = s.accept()

print(f"User {addr[1]} connected o/")

#print(u_sock)

users.append(u_sock)

u_addr.append(addr[1])

listen_accepted_u = threading.Thread(

target=listen_u,

args=(u_sock, addr,)

)

listen_accepted_u.start()

if __name__ == "__main__":

start_serv()

Листинг программы для сервера:

import socket

from threading import Thread

client = socket.socket(

socket.AF_INET,

socket.SOCK_STREAM,

)

client.connect(

("localhost", 1225)

)

def listen_s():

while True:

data = client.recv(4096)

print(data.decode("utf-8"))

if data.decode("utf-8") == "Bye":

client.close()

break

def send_s():

listen_t = Thread(target=listen_s)

listen_t.start()

x = input("Your name: ")

client.send(x.encode("utf-8"))

while True:

x = input("-")

if x != "":

client.send(x.encode("utf-8"))

else:

client.send("Bye".encode("utf-8"))

#client.close()

break

if __name__ == "__main__":

send_s()

Результат работы:

Рисунок 1 – Результат выполнения программы

Вывод: в ходе выполнения лабораторной работы были сформированы практические навыки написания клиентских и серверных приложений на языке Python, изучена технология клиент-серверного программного общения; разработано клиент-серверное приложение на языке Python в соответствии с вариантом.