Форум программистов, компьютерный форум, киберфорум
Python: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/40: Рейтинг темы: голосов - 40, средняя оценка - 4.88
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407

Либа socket, не прилетают сообщения от сервера

04.10.2020, 21:50. Показов 7635. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Продолжаю учиться писать сетевые программки и тут вышел косяк. Скину основные куски кода, потом поясню:

Сервер
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
class Server(object):
 
    # Создание и запуск сервера
    def BuildServer(self):
 
        self.UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.UDP.bind((self.host, self.port))
 
    # Принятие сообщений и их расшифровка
    def AcceptMessage(self, data, user_address):
            print("[" + nickname + "]: ", data)
 
    # Жизненный цикл сервера
    def StartServer(self):
        while not quit:
            # data - данные, которые передает пользователь
            # user_address - уникальный адрес пользователя
            data, user_address = self.UDP.recvfrom(1024)
 
            # Сообщение отправленное одним пользователем отправляем всем остальным
            for client in self.clients_ip:
                if user_address != client:
                    self.UDP.sendto(data, user_address)
 
            # Преобразуем данные в строки
            data = data.decode("utf-8")
 
            self.AcceptMessage(data, user_address)
 
            # Отключаем сервер при вводе "shutdown"
            if data == "/shutdown":
                self.UDP.close()
                self.quit = True
 
first_server = Server()
first_server.BuildServer()
first_server.StartServer()



Клиент
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
class Client(object):
 
    # Создание сервер-клиента
    def BuildClient(self):
        # Создаем сервер-клиент по ранее указанному ip и port-у по протоколу TCP/IP
        self.UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.UDP.bind((self.host, self.port))
        self.UDP.setblocking(False)
 
    # Метод принимающий сообщения
    def ReceivingMessage(self):
        while True:
            data, server_address = self.UDP.recvfrom(1024)
            message = data.decode("utf-8")
 
            print("[", server_address, "]: ", message)
 
    # Метод отправляющий сообщения
    def SendMessage(self, message):
        self.UDP.sendto(message.encode("utf-8"), self.server)
 
    # Жизненный цикл сервер-клиента
    def StartClient(self):
        nick_name = input("Enter by nickname: ")
        self.SendMessage(nick_name)
        self.join = True
    
        while self.join:
            format_host = str(self.host).replace(" ", "")
            format_port = str(self.port).replace(" ", "")
 
            print("[", format_host, ":", format_port, "] - ", end="")
            message = input()
 
            self.SendMessage(message)
 
first_client = Client()
first_client.BuildClient()
first_client.StartClient()
 
first_thread = threading.Thread(target=first_client.ReceivingMessage())
first_thread.start()


В классе сервера смотрим StartServer -> AcceptMessage. Тут все прекрасно работает. Сообщения по локальной сети прилетают на сервер. Но как только речь идет о клиенте... смотрим вызов потока в конце и после функцию ReceivingMessage. Почему то она не отлаживается находясь в отдельном потоке и такое чувство будто вообще не выполняется. Что не так я делаю?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.10.2020, 21:50
Ответы с готовыми решениями:

Ошибка: Socket WouldBlock, при отправке сообщения от сервера к клиенту
Привет, есть некий сервер, раньше работало все четко, а после последних изменений (незначительных) стала вылазить ошибка в сабже, и только...

Братцы! Либа NTP-сервера.
Здравствуйте! Проблема в следующем. Скачал c оф сайта ntp-4.2.6p3, написано на "с" собрал в VS 2008. Получил следующие файлы: ntpd.lib,...

Socket.io сообщения
В общем недавно набрел вот на такую статью, про то как организовать личные сообщения на Socket.io + MySQL. Меня очень заинтересовала эта...

2
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
06.10.2020, 09:30
Ну да, так как выполнение кода не доходит до 41-42 строк в клиенте. Поменяйте их местами с first_client.StartClient()
1
6 / 3 / 0
Регистрация: 04.05.2018
Сообщений: 407
06.10.2020, 14:09  [ТС]
Рыжий Лис, Уже совсем забылся про эту тему. Много косяков я поиспровлял, теперь другая проблема. Такое чувство будто поток который я создаю просто отключается и не ловит пакеты данных в "фоновом" режиме. При чем если писать
Code
1
self.UDP.setblocking(False)
то он ругается. Проще говоря отдельный поток как будто идет основным и блокирует input() - пользователь не может написать ничего в консоль
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
    # Метод принимающий сообщения
    def ReceivingMessage(self):
        while True:
            data, server_address = self.UDP.recvfrom(1024)
            message = data.decode("utf-8")
 
            print("[", server_address, "]: ", message)
 
    # Метод отправляющий сообщения
    def SendMessage(self, message):
        self.UDP.sendto(message.encode("utf-8"), self.server)
 
    # Жизненный цикл сервер-клиента
    def StartClient(self):
        first_thread = threading.Thread(target=self.ReceivingMessage(), daemon=True) # Тут уже по приколу попробовал daemon добавить...
        first_thread.start()
 
        while self.join:
 
            # Отключение от сервера в случае команды "/disconnect"
            if (message == "/disconnect"):
                self.join = False
                self.SendMessage(message)
                self.UDP.close()
                first_thread.join()
            else:
                self.SendMessage(message)
И еще. Если увидите ошибки со стороны клинкода, сообщите пожалуйста

Рыжий Лис,
Следующая ошибка вылетает если блокировку отключить:
BlockingIOError: [WinError 10035] Операция на незаблокированном сокете не может быть завершена немедленно

Проблема найдена. Дело вовсе не в запросах. После старта потока исполняется код потока и только.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.10.2020, 14:09
Помогаю со студенческими работами здесь

Перемешиваются сообщения socket
Столкнулся с такой проблемой, что при отправке нескольких сообщений у получателя эти сообщения перемешиваются или сливаются в одно, как это...

C++ socket.io не получает сообщения
Всем привет. Пытаюсь подключиться к coincap.io API по средствам их сокетов. Подключает вообщем нормально, одна не приходит никаких...

Socket сообщения слепливаются!
Объясните пожалуйста почему когда я отправляю два сообщения серверу? ClientSocket1->Socket->SendText("12"); ...

Принимает но не отправляет сообщения! (Socket)
Сообщения от клиента приходят на сервер и сервер должен отправить всем клиентам, однако он почему-то только получает но не отправляет, а...

Передача сообщения от клиентов к серверу Socket
Доброго времени суток, сидел целые 2 сутки думал разберусь сам... но не тут то было... Суть проблемы: Надо написать службу которая через...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru