Проблема с вводом при использовании сокетов tcp - PullRequest
0 голосов
/ 29 марта 2020

У меня есть один TCP-сервер и два подключенных клиента. Это игра ti c ta c, поэтому клиенты делают свои ходы один за другим. Сервер отправляет пакет клиенту, чтобы сказать, что он позволяет вводить, а второй клиент просто ждет. Проблема в том, что второй клиент, ожидающий, может что-то написать, но не отправит на сервер до своей очереди. вывод сервера . второй клиент . Так что проблема в том, что когда повороты превращаются во второго клиента, и он что-то написал перед этим, он отправляется на сервер. Как я могу «очистить» все до того, как «Ваша очередь, введите (строка строки)»

«Ваша очередь, введите (строка строки)» - означает отправленный сервером пакет и ждать пользователя input

«Все в порядке» - означает, что пользовательский ввод доставлен на сервер

Сервер:

            if is_x:
                players[0].send(b'\0x01')
                client_move = sock_manipulation.receive_move(players[0])
                if client_move:
                    players[0].send('Everything ok'.encode())
                    print(f'Client move: {client_move}')
                else:
                    print('Nothing received!')
                is_x = False
            else:
                players[1].send(b'\0x01')
                client_move = sock_manipulation.receive_move(players[1])
                if client_move:
                    players[1].send('Everything ok'.encode())
                    print(f'Client move: {client_move}')
                else:
                    print('Nothing received!')
                is_x = True

Клиент:

    while 1:
    command = sock.recv(2048)
    if command == b'\0x01':
        move = pickle.dumps(input('Your turn, enter (row col): ').split())
        sock.send(move)
        accept = sock.recv(2048)
        print(accept.decode())

1 Ответ

0 голосов
/ 29 марта 2020

Две возможности:

  • Закрыть клиентское соединение, когда не его очередь
    • клиент должен попытаться переподключиться, но сервер примет только если это его очередь
  • Сервер всегда должен получать от клиента, но если это не его очередь, данные recv игнорируются

Лично я бы использовал второй вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...