Эксперт
Сергей
Сергей
Задать вопрос
Мы готовы помочь Вам.

Цель работы: сформировать навыки разработки клиентских и серверных приложений на языке программирования 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 в соответствии с вариантом.

Была ли полезна данная статья?
Да
61.09%
Нет
38.91%
Проголосовало: 1105

или напишите нам прямо сейчас:

⚠️ Пожалуйста, пишите в MAX или заполните форму выше.
В России Telegram и WhatsApp блокируют - сообщения могут не дойти.
Написать в MAXНаписать в TelegramНаписать в WhatsApp