Взаимодействие двух хостов в сетевой игре? Я пишу серверную часть игры шашки. Имеются 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()
Для того чтобы обрабатывать сигналы от двух хостов одновременно, вам нужно использовать механизм многопоточности или многозадачности. Вы можете создать два потока или процесса для каждого хоста, чтобы обрабатывать сигналы асинхронно.
Ниже приведен пример кода, который демонстрирует использование многопоточности для обработки сообщений от двух хостов одновременно:
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()
В этом примере каждый хост обрабатывается в отдельном потоке, что позволяет им обмениваться сообщениями одновременно. Вы можете модифицировать этот код для обработки различных сигналов, таких как начало новой игры или выход, в зависимости от данных, полученных от клиентов.
Для того чтобы обрабатывать сигналы от двух хостов одновременно, вам нужно использовать механизм многопоточности или многозадачности. Вы можете создать два потока или процесса для каждого хоста, чтобы обрабатывать сигналы асинхронно.
Ниже приведен пример кода, который демонстрирует использование многопоточности для обработки сообщений от двух хостов одновременно:
import pickleimport 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()
В этом примере каждый хост обрабатывается в отдельном потоке, что позволяет им обмениваться сообщениями одновременно. Вы можете модифицировать этот код для обработки различных сигналов, таких как начало новой игры или выход, в зависимости от данных, полученных от клиентов.