Лабораторная работа — Практика работы с сокетами
Реализовать простой “эхо-чат” с использованием сокетов.
Условия:
- Сервер должен отправлять всем клиентам (кроме отправителя) сообщение, которое он получил от клиента-отправителя (эхо). Пример:
Клиент1: >>> Привет.
Сервер: >>> @Клиент1: Привет.
- Сервер и клиент должны быть реализованы и запускаться отдельно.
- Клиентов может быть неограниченное количество, однако сервер не должен блокироваться одним клиентом. (Следует использовать потоки и/или асинхронный подход)
Решение:
Прежде чем перейти к выполнению данной лабораторной работы, определим некоторые дополнительные условия, чтобы не усложнять разрабатываемую программу.
Как было сказано в теоретической справке: socket — реализован в стандартной поставке большинства популярных языков программирования, в частности Java, Python, C#, C/С++, Go и. т. д. Поэтому представленные лаботорные задания можно выполнить на любом любимом языке программирования. В данном разборе мы будем использовать язык программирования Python, версии 3.6+.
В представленном примере, с целью упрощения, умышленно не применяются современные практики разработки сетевых приложений, такие как асинхронный подход, а также высокоуровневые структуры для работы с сетью, типа websocket и другие, чтобы показать, как сетевые приложения реализуются на низком уровне.
Подробнее с асинхронностью (в частности в Python) вы можете ознакомиться самостоятельно и впоследствии улучшить своё решение. Также, в целях упрощения, в представленном решении мы не будем реализовывать графический интерфейс и модуль logging, Интерфейс реализуем через стандартный терминал.
Перейдем к разбору решения.
Предполагается, что Python версии 3.6 или более поздней у вас уже установлен.
Создадим python-пакет (папка с файлами __init__.py, client.py, server.py). Скриншот созданного пакета представлен на рисунке 3.

Рис. 3 — Python-пакет с разрабатываемой программой
Откроем файл server.py любым предпочитаемым редактором и начнем реализацию нашего сервера. В данной лабораторной работе мы создадим классическое клиент-серверное приложение, а в следующей перейдем к реализации P2P чата и переделаем наш сервер в “сигнальный”.
Для избежание проблем сериализации и разбора данных в сетевых приложениях часто прибегают к применению специализированных протоколов. Мы в нашей реализации не станем делать исключение и реализуем простой протокол, который называется JSON Message Protocol, суть которого заключается в обмене json объектами вместо “сырых” данных.
Импортируем необходимые пакеты и модули и опишем класс для сообщений, которые сервер будет принимать и отсылать.
| import socket # Стандартный модуль socket. # Подробнее: https://docs.python.org/3/library/socket.html import sys # Стандартный модуль sys. # Подробнее: https://docs.python.org/3/library/sys.html import time # Стандартный модуль time. # Подробнее: https://docs.python.org/3/library/time.html import json # Стандартный модуль json. # Подробнее: https://docs.python.org/3/library/json.html class Message: которые будут приходить от клиентов. def __init__(self, status_code: str = ‘200’, **data): def to_json(self): |
Далее создадим класс обработчик, который будет отвечать за обработку, предподготовку и отправку сообщений клиентам.
| class ServerDataHandler: «»» Класс-Обработчик с бизнес-логикой сервера. Реализует методы обработки сообщений и их рассылки. «»» clients = {} # Временное хранилище клиентов в виде словаря. # Если хотите реализовать *продвинутое решение, можете реализовать # взаимодействие с базой данных и сохранением пользователей. current_connection = None # текущее соединение def _add_connection(self, name: str, addr: str): def get_and_register_message(self, data: bytes, addr: str): :param data — полученные «сырые» данные в виде bytes def send_message(self, sock, message_obj: Message): |
Наконец, реализуем “точку входа” нашего приложения, в котором непосредственно создадим сокет и будем ждать сообщений и подключений. В нашем разборе мы будем запускать сервер и клиентов локально на нашей же машине (localhost), однако, вам ничего не мешает изменить ip-адрес на ip-адрес вашего устройства в локальной или глобальной сети и использовать разработанное приложение как полноценный чат.
|
if __name__ == «__main__»: # Создаем объект серверного сокета. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # host и port на котором будет запущен сервер host = ‘localhost’ port = 8888 # Устанавливаем опцию для текущего адреса сокета, # чтобы его можно было переиспользовать в последующих перезапуска: s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Регистрируем сокет s.bind((host, port)) # Создаем обработчик бизнес-логики data_handler = ServerDataHandler() # Флаг для остановки работы сервера quit_server = False print(«Server started») # Основной цикл работы сервера. # Регистрируем сообщение except Exception as ex: |
С разработкой серверной логики мы закончили, можно переходить к клиентской. Напишем обработчики отправки и получения сообщений для клиента. Начнем как и в случае с клиентом с импорта необходимых библиотек и модулей и объявления класса Сообщения (Message).
| import socket # Стандартный модуль socket. # Подробнее: https://docs.python.org/3/library/socket.html import sys # Стандартный модуль sys. # Подробнее: https://docs.python.org/3/library/sys.html import time # Стандартный модуль time. # Подробнее: https://docs.python.org/3/library/time.html import json # Стандартный модуль json. # Подробнее: https://docs.python.org/3/library/json.html import threading # Глобальная переменная, отвечающая за остановку клиента. class Message: def __init__(self, **data): # Распаковываем кортеж именованных аргументов в параметры класса. # время получения сообщения: def to_json(self):
Напишем класс Обработчик (ClientHandler), который будет отвечать за получение и отправку клиентских сообщений. class ClientHandler: def __init__(self, server_addr=(‘localhost’, 8888), @staticmethod def receive(self): def send(self): |
“Точка входа” для клиентских приложений будет ещё проще, чем серверная. Просто создаем наш обработчик и запускаем функции обработки. Обработку отправки и получения разделим на два параллельных потока, так как эти функции блокирующие.
| if __name__ == ‘__main__’: # Создаем обработчик клиента handler = ClientHandler(server_addr=(‘localhost’, 8888), client_addr=(‘localhost’, 0)) # В отдельном потоке вызываем обработку получения сообщений: recv_thread = threading.Thread(target=handler.receive) recv_thread.start() # В главном потоке вызываем обработку отправки сообщений: handler.send() # Прикрепляем поток с обработкой получения сообщений к главному потоку: recv_thread.join() |
Запустим наш сервер и двух клиентов, чтобы протестировать работоспособность программы. Для запуска вы можете использовать любой терминал в случае с Unix, или “командную строку” в случае с Windows. На рисунках 4-6 представлен пример работы с использованием терминала, встроенного в IDE PyCharm и ОС Windows 10.

Рис. 4 — Результат работы сервера

Рис. 5 — Результат работы первого тестового клиента

Рис. 6 — Результат работы второго тестового клиента
Поздравляем! Вот вы и создали собственный простой чат с использованием сокетов. Однако, разобранный пример — традиционное клиент-серверное приложение. Для реализации P2P соединения необходимо будет внести в него некоторые изменения, однако, принцип межсетевого взаимодействия останется таким же. Полностью готовое решение вы можете посмотреть в репозиторий.
или напишите нам прямо сейчас:
Здравствуйте. Скажите пожалуйста, планирую поступать в магистратуру на факультет Психологии « Психология личности»в РГГУ скажите пожалуйста, есть ли у вас, ответы на вступительные экзамены? так как, планирую, сделать акцент на бюджет. Спасибо.
Арсений, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Дистанционная помощь в защите ВКР
Анастасия, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Здравствуйте. Нужна срочно практическая часть вкр, третья глава. Скину похожие работы, на которые можно ориентироваться
Александр, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
вкр по теме: экологический туризм России : анализ состояния, проблемы и перспективы
Людмила, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Здравствуйте вы защищаете ВКР?
Ольга, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Написать магистерскую ВКР на тему «Совершенствование логистических бизнес-процессов на примере торговой компании». Не менее 100 страниц.
Миша, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Здравствуйте нужна работа Вкр
Лена, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Написать ВКР 3 раздела Тема строительство строительство жилого дома с применением каркасно-монолитных технологий Антиплагиат от 75% ПЗ и чертежи
Владимир, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.