2 / 2 / 0
Регистрация: 17.03.2021
Сообщений: 15

Как реализовать чат между клиентом и сервером, используя UDP и ООП

09.10.2021, 21:20. Показов 2186. Ответов 2

Студворк — интернет-сервис помощи студентам
Добрый день, я новичок в изучении пайтона, пытаюсь реализовать клиент серверный обмен сообщениями по протоколу udp, проще говоря чат.
Сервер более-менее работает, за исключением того, что для получения возможности обратно ответить клиенту, сообщение клиент должен отослать несколько раз. А вот с кодом клиента у меня беда: клиент не видит полученное сообщение, понимаю, что в методе listen_server нужно указать адрес и порт отправителя, но я не понимаю где конкретно, а если тупо впихнуть client.bind() в метод, то получаю ошибку Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)
Ниже привожу код сервера:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Server:
    def __init__(self):
        self.server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 
    def set_up(self):
        self.server.bind(("127.0.0.1", 9099))
        print("Server is listening")
        self.listening_socket()
 
        listen_thread = threading.Thread(target=self.get_msgs)
        listen_thread.start()
 
        send_thread = threading.Thread(target=self.send_msgs)
        send_thread.start()
 
    def listening_socket(self):
        while True:
            data, addr = self.server.recvfrom(1024)
 
            self.get_msgs(data, addr)
            self.send_msgs(addr)
 
    def get_msgs(self, data, addr):
        get_msg = data.decode("utf-8")
        print(f"User <{addr[0]}> sent {get_msg}")
        if get_msg == 'q':
            print("Другой участник закончил чат, пока!")
 
    def send_msgs(self, addr):
        data, addr = self.server.recvfrom(1024)
        a = input("Ввдите сообщение:  ")
        send_to_client = a.encode("utf-8")
        self.server.sendto(send_to_client, addr)
 
 
if __name__ == "__main__":
    server = Server()
    server.set_up()
Код клиента:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Client:
    def __init__(self):
        self.client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        print("Client connection")
 
    def set_up(self):
        send_thread = Thread(target=self.send_data)
        send_thread.start()
 
        listen_thread = Thread(target=self.listen_server)
        listen_thread.start()
 
    def send_data(self):
        while True:
            msg = input("Введите сообщение:  ").encode("utf-8")
            self.client.sendto(msg, ("127.0.0.1", 9099))
            if msg.decode("utf-8") == 'q':
                print("Вы акончили чат!")
                break
 
    def listen_server(self):
        while True:
            back_msg = self.client.recv(1024).decode("utf-8")  # receive data from client
            print("Полученное сообщение: ", back_msg)
 
 
if __name__ == '__main__':
    client = Client()
    client.set_up()
Подскажите в чем ошибки, может быть я не правильно реализую принципы ООП?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.10.2021, 21:20
Ответы с готовыми решениями:

UDP. Передача картинок между клиентом и сервером
Будьте добры скиньте пожалуйста приложение на WinForms у кого такое есть, где происходит передача картинок например, между клиентом и...

Работа с CAsyncSocket: чат между сервером и клиентом
нашёл проект, реализующий чат между сервером и клиентом при помощи CSocket. Как можно переделать этот чат на CAsyncSocket. Попробовал везде...

Как реализовать передачу данных между клиентом и сервером
прошу помощи... Нужно создать приложение с сборками: -site - клиент -objects- сборка с сущностями и интерейсами для дата...

2
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,695
Записей в блоге: 29
15.10.2021, 06:21
Alarih_, а что ты почитал по сокетам? например дальше 8 строчки в сервере код выполняться не будет, знаешь почему?

почему ты выбрал удп для чата? интересны твои аргументы
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2696 / 1602 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
15.10.2021, 09:07
Лучший ответ Сообщение было отмечено Alarih_ как решение

Решение

Сервер:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import asyncio
 
 
class ServerHandler(asyncio.Protocol):
 
    def connection_made(self, transport: asyncio.DatagramTransport) -> None:
        self.transport: asyncio.DatagramTransport = transport
        self.host, self.port = transport.get_extra_info("peername")
        self.on_connect(self.host, self.port)
    
    def data_received(self, response: bytes) -> None:
        self.on_message(self.host, self.port, response.decode("utf-8", "ignore"))
 
    def connection_lost(self, exception: Exception = None) -> None:
        self.on_disconnect(self.host, self.port, str(exception))
    
    def on_connect(self, host: str, port: str) -> None:
        print(f"CONNECTED CLIENT[{host}:{port}]")
    
    def on_message(self, host: str, port: str, message: str) -> None:
        print(f"MESSAGE: {message} FROM: {host}:{port}")
    
    def on_disconnect(self, host: str, port: int, reason: str = None) -> None:
        print(f"DISCONNECTED CLIENT[{host}:{port}] REASON - {reason}")
 
 
class Server:
    def __init__(self, host: str, port: int) -> None:
        self.host, self.port = host, port
 
    def start(self) -> None:
        asyncio.run(self.run())
    
    async def run(self) -> None:
        loop = asyncio.get_event_loop()
        server = await loop.create_server(
            lambda: ServerHandler(), self.host, self.port)
        async with server:
            await server.serve_forever()
 
 
if __name__ == "__main__":
    Server("127.0.0.1", 8888).start()
Проверка:
Python
1
2
3
4
5
6
import socket
 
client = socket.socket()
client.connect(("127.0.0.1", 8888))
client.send(b"Hello, world!")
client.close()
Результат:
Code
1
2
3
CONNECTED CLIENT[127.0.0.1:16124]
MESSAGE: Hello, world! FROM: 127.0.0.1:16124
DISCONNECTED CLIENT[127.0.0.1:16124] REASON - None
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.10.2021, 09:07
Помогаю со студенческими работами здесь

Обмен пакетами между сервером и клиентом через UDP протокол
Есть связка сервер - клиент на udp сокетах. Отправляю с клиента пакет серверу, и сразу беру пакет от сервера. На сервере сначала принимаем...

Как происходит передача данных между клиентом и сервером используя модель Entity Framework?
Entity Framework является некой оберткой над ado.net, но как происходит передача данных между сервером и клиентом, используя EF, то есть,...

Как закрыть соединение между клиентом и сервером
Как закрыть соединение между клиентом и сервером, не закрывая порт (который открыт не мной)?

Как организовать передачу данных между сервером и клиентом?
Есть задумка сделать, от нечего делать, как бы игру-стратегию, в которой все будет отображаться через текст(на подобие войны племен,...

Как установить соединение между клиентом и сервером в интернете?
Имеются 2 компьютера в интернете с динамическими ip-адресами. Нужно на одном из них создать подключение(сервер), а на другом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru