Как получить данные от нескольких клиентов с помощью Python Socket - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь сделать сетевую игру для 2 игроков. Я создал сервер и клиенты, они могут соединиться. Проблема заключается в том, что когда два клиента пытаются отправить информацию, сервер не обрабатывает информацию от обоих клиентов правильно, а обрабатывает ее правильно, когда подключен только один клиент. Это код сервера:

import socket
import os

numOfClients = 0
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

serversocket.bind(('192.168.88.1', 10000))
serversocket.listen(5)
while numOfClients != 2:
    if numOfClients == 0:
        c, a = serversocket.accept()
    elif numOfClients == 1:
        c1, a1 = serversocket.accept()
    if numOfClients == 0:
        print(a, 'has connected!')
    elif numOfClients == 1:
        print(a1, 'has connected!')
    numOfClients += 1
    print('Connected to ', a)
print("2 Players have connected!")
while True:
    msg1 = c.recv(1024)
    if msg1 != b'':
        print(msg1, '1')
    msg2 = c1.recv(1024)
    if msg2 != b'':
        print(msg2, '2')

Это весь код клиента, который вам действительно нужен:

# Socket Stuff
port = 10000
host = '192.168.88.1'
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server = host, port
socket.connect(server)
socketMsg = b''

# Main Game loop
while True:
    # Calls Functions
    socket.send(socketMsg)
    # socketMsg is assigned above, it is assigned to b'Works!' just so that I can see if it actually works
    socketMsg = b''
    redrawWin()
    get_events()

Если я сделал что-то не так в этом посте, извините, этомой второй пост в стеке

1 Ответ

0 голосов
/ 13 ноября 2019

Ваше первое сокетное соединение заблокировало позднее соединение. Есть несколько решений для этого.

  • Использовать неблокирующий режим. Модуль select предназначен для управления этим.
  • Использование многопоточности, что означает, что каждый клиент будет иметь независимый поток.
  • Использование asyncio
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...