/PythonChat

Мои первый проект на Python - чат для общения по socket. Проект сделан в колледж Сириус- "Основы программирования"

Primary LanguagePython

Курс "Основы программирования"

Список заданий

  • Описание теории
  • Создать список пользователей(*Создать Базу данных)
  • Создать общение пользователей друг с другом, а не с сервером.
  • При подключении отображать пользователей на выбор
  • Создать описания кода и оформить код

Структура

  • Описание работы
  • Теоритическая часть
  • Практическая часть
  • Фотографии работ
  • Выводы

Задача

Создать чат через программный интерфейс для обеспечения информационного обмена между процессами - socket. Сервер должен принимать сообщение от опредленного пользователя и отправлять другому.

Установка чата к себе на компьютер

  1. Клонируем репозиторий
git clone https://github.com/Dubrovsky18/PythonChat.git
  1. Выполняем команду
sh PythonChat/download.sh
  • Совет: закрыть консоль и снова открыть
  1. Запускаем сервер
chat-server
  1. Запускаем клиента (один/множество раз)
chat
  • Если не сработает тогда заходим в папку, которую копировали из github и запускаем
  1. Запуск сервера
python3 server.py
  1. Запуск клиента
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()

Фотографии работ

Alt text

Alt text

Alt text

Выводы

В данной работе я выяснил как должны работать сервера чатов, как устроен socket: его модули и функции, осознал логику потоков в Python. Но главное, что я хочу выделить - подготовка к написанию кода. Первым делом стоит разработать план и осознать логику кода, так как мы будем общаться с машиной, как иностранцы. Без понятной, и четкой грамматики/синктаксиса-структуры нас не поймут. Для масшатабных проектов стоит чертить некие схемы, чтобы видеть наглядно, что делает сервер, что делают клиенты, кто куда и зачем отправляет. Основной проблемой стало понимание этой логики, но ознакомившись с документацией различных библиотек я понял, что лучше всего для поставленной задачи сгодится именно библеотека threading, ведь с помощью нее можно реализовать многопоточность и выполнить поставленную задачу по созданию функции личных сообщений в консольном чате. Поставленна задача была выполнена в полном объеме и в заложенные сроки, без потери качества кода и его функциональности.