
OS_LR3 (сервак)
.docx
|
Министерство науки и высшего образования Российской Федерации Калужский филиал федерального государственного бюджетного образовательного учреждения высшего образования «Московский государственный технический университет имени Н.Э. Баумана (национальный исследовательский университет)» (КФ МГТУ им. Н.Э. Баумана) |
ФАКУЛЬТЕТ _ИУК «Информатика и управление»
КАФЕДРА ИУК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 в соответствии с вариантом.