Взаимодействие двух хостов в сетевой игре? Я пишу серверную часть игры шашки.
Имеются 2 клиента. Каждый клиент может начать кнопку новой игры, выхода или продолжить ходить. Если он ходит, то тут проверяется очередность: белые или черные ходят. А нажать кнопку новой игры или закрытия может любой из них и вегда. И вот я не понимаю: как сделать так, чтобы сигнал и от одного и от другого мы могли "слышать" сразу а не по очереди?
import pickle
import socket
what_colour_now='white'
sock = socket.socket()
sock.bind(('', 9090))
sock.listen(2)
#принимаем соединения для двух хостов
conn1, addr1 = sock.accept()
conn2, addr2 = sock.accept()
while True:
#то что прислал один из игроков
#и вот тут проблема! как сделать так чтобы мы вне зависимости от порядка их могли реагировать на кнопки новой игры и закрытия. просто если я напишу как тут то мы сперва ждем что скажет первый хост а потом реагируем на второй. а если к примеру первый будет что то там долго думать то что второй просто не сможет нам ничего отправить. А если он хотел начать новую игру или выйти? тоесть как сделать так чтобы на эти 2 события мы реагировали сразу?
data1 = conn1.recv(1024)
data2 = conn2.recv(1024)
if not data:
break
f=pickle.loads(data)
conn2.close()
conn1.close()

21 Авг 2019 в 06:34
263 +1
0
Ответы
1

Для того чтобы обрабатывать сигналы от двух хостов одновременно, вам нужно использовать механизм многопоточности или многозадачности. Вы можете создать два потока или процесса для каждого хоста, чтобы обрабатывать сигналы асинхронно.

Ниже приведен пример кода, который демонстрирует использование многопоточности для обработки сообщений от двух хостов одновременно:

import pickle
import socket
import threading
def handle_client(conn):
while True:
data = conn.recv(1024)
if not data:
break
# Обработка данных от клиента
print(data.decode())
sock = socket.socket()
sock.bind(('', 9090))
sock.listen(2)
conn1, addr1 = sock.accept()
conn2, addr2 = sock.accept()
# Создание потоков для обработки сообщений от каждого хоста
thread1 = threading.Thread(target=handle_client, args=(conn1,))
thread2 = threading.Thread(target=handle_client, args=(conn2,))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
conn2.close()
conn1.close()

В этом примере каждый хост обрабатывается в отдельном потоке, что позволяет им обмениваться сообщениями одновременно. Вы можете модифицировать этот код для обработки различных сигналов, таких как начало новой игры или выход, в зависимости от данных, полученных от клиентов.

20 Апр в 13:16
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 718 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир