- Описание теории
- Создать список пользователей(*Создать Базу данных)
- Создать общение пользователей друг с другом, а не с сервером.
- При подключении отображать пользователей на выбор
- Создать описания кода и оформить код
- Описание работы
- Теоритическая часть
- Практическая часть
- Фотографии работ
- Выводы
Создать чат через программный интерфейс для обеспечения информационного обмена между процессами - socket. Сервер должен принимать сообщение от опредленного пользователя и отправлять другому.
Установка чата к себе на компьютер
- Клонируем репозиторий
git clone https://github.com/Dubrovsky18/PythonChat.git
- Выполняем команду
sh PythonChat/download.sh
- Совет: закрыть консоль и снова открыть
- Запускаем сервер
chat-server
- Запускаем клиента (один/множество раз)
chat
- Если не сработает тогда заходим в папку, которую копировали из github и запускаем
- Запуск сервера
python3 server.py
- Запуск клиента
python3 client.py
Существует 2 вида socket:
- Серверный - принимающая сторона
- Клиентский - отправляющая сторона
В данном случае у нас клиенты будут отправлять всё серверу и получать от сервера. Socket рабоает на транспортном уровне:
- Потоковый (TCP) - socket, который установил двустороннее соединение, передат поток байтов.
- Дейтаграммные(UDP) - socket не требует явного подключения между ними
Socket состоит из Ip-адреса и Port.
Для написания проекта выделим то, что нам нужно:
- Строгая последовательность команд для сервера и клиента
- Параллельное выполнения процессов - Асинхроность(выполнение задач независимо от других процессов)
- Обработка ошибок
В решении данного задания стоит знать базовые понятия потока и процесса
-
Поток рабоает внутри процесса
-
Потоки позволяют запустить выполнение нескольких задач в конкурентном режиме в рамках одного процесса интерпретатора.
-
Процесс - запущенная программа. Процессу выделяются отдельные ресурсы: память, процессорное время поток (thread) - это единица исполнения в процессе.
-
Потоки разделяют ресурсы процесса, к которому они относятся.
# Импортируем нужные модули
import argparse
import socket
import sys
import threading
import time
# Списки и Словари для удобного поиска пользователей
list_dict_client = {}
list_listen = []
list_nickname = []
list_dict_nickname = {}
# Функция для удаление пользователя, если он выйдет из чата
def delete(client:socket):
# Функция для отправки сообщения
def send(to_client:socket, msg:str):
# Функция для принятия сообщения и обработки специальных команд
def recv(client:socket) -> str
# Функция для общего чата
def send_to_broadcast(nickname:str, str)
# Функция для ожидания подключения пользователя и отправки его в отдлеьный поток
def start_server()
# Функция для авторизации пользователя, чтобы не было одинаковых NICKNAME
def authoruzation(client:socket) -> str
# Функция для приветствия нового пользователя и предоставить ему выбор режима чата
def welcome(client:socket):
# Функция которая дает пользователю выбрать себе собеседника
def choose_for_one(client:socket) -> str
# Функция специальных слов
def word(client:socket, message:str):
# Функция самого чата, в котором происходят все беседы
def chat(client_from:socket, client_to:socket , flag: boolean):
# При запуске команды chat-server можно указать флаги ip-адреса и/или порта, по которому подключатся
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--ip_address', default='127.0.0.1')
parser.add_argument('-p', '--port', default='12345')
args = parser.parse_args(sys.argv[1:])
ip = str(args.ip_address)
porting = int(args.port)
# # При запуске команды chat можно указать флаги ip-адреса и/или порта, по которому подключатся
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--ip_adress', default='127.0.0.1')
parser.add_argument('-p', '--port', default='12345')
args = parser.parse_args(sys.argv[1:])
ip = str(args.ip_adress)
porting = int(args.port)
# Функция анимации ожидания
def proces()
# Функция принятия сообщаний
def recv():
# Функция отправки сообщений
def sent():
# Основной модуль подключения
client_socket = socket.socket()
client_socket.connect((str(ip), int(porting)))
nickname = input("Your nickname: ")
thread = threading.Thread(target=recv)
thread.start()
thread_sent = threading.Thread(target=sent)
thread_sent.start()
В данной работе я выяснил как должны работать сервера чатов, как устроен socket: его модули и функции, осознал логику потоков в Python. Но главное, что я хочу выделить - подготовка к написанию кода. Первым делом стоит разработать план и осознать логику кода, так как мы будем общаться с машиной, как иностранцы. Без понятной, и четкой грамматики/синктаксиса-структуры нас не поймут. Для масшатабных проектов стоит чертить некие схемы, чтобы видеть наглядно, что делает сервер, что делают клиенты, кто куда и зачем отправляет. Основной проблемой стало понимание этой логики, но ознакомившись с документацией различных библиотек я понял, что лучше всего для поставленной задачи сгодится именно библеотека threading, ведь с помощью нее можно реализовать многопоточность и выполнить поставленную задачу по созданию функции личных сообщений в консольном чате. Поставленна задача была выполнена в полном объеме и в заложенные сроки, без потери качества кода и его функциональности.