Итак, я пытаюсь написать программу, которая получает непрерывный поток данных с сервера в потоке. Данные, отправляемые с сервера, всегда очень короткие, но имеют разную длину.
В настоящее время я пытаюсь использовать функцию recv в библиотеке сокетов для постоянного получения данных, но почему-то вообще ничего не получаю. Я знаю, что общая проблема с функцией recv заключается в том, что она иногда разбивает данные, но для меня она ничего не получает. Я знаю, что проблема не в сервере, потому что когда клиент подключается, он получает подтверждение от сервера. Это потому, что я пытаюсь сделать это в другом потоке?
Это часть сокета моего кода:
client = socket(AF_INET, SOCK_STREAM)
def connectToServer(host, port):
global client
try:
client.connect((host, port))
connectionResult = client.recv(2048).decode()
if connectionResult == 'succesfull connection':
return connectionResult
else:
return 'connection failed'
except:
return 'connection failed'
# This function is ran in a thread (from another module)
def getUpdatesFromServer(updateQueue):
global client
while True:
receivedUpdate = client.recv(10000).decode()
if receivedUpdate == 'server went down':
updateQueue.put('server went down')
И это код, который запускает поток:
getUpdatesFromServerThread = Thread(target=ServerConnect.getUpdatesFromServer, args=(GameState.screenUpdateQueue,))
getUpdatesFromServerThread.daemon = True
getUpdatesFromServerThread.start()
Здесь вызывается функция connectToServer (первое, что происходит при запуске клиента):
connectionOutcome = ServerConnect.connectToServer(host, port)
if connectionOutcome == 'succesfull connection':
startGame()
else:
print('\n\nFailed to connect to the server. Please check your internet connection. If your internet connection is okay, it probably means the server is down and you should wait for a while.\n\n')
А вот функция startGame:
def startGame():
print('You have been succesfully connected to the server.')
getUpdatesFromServerThread = Thread(target=ServerConnect.getUpdatesFromServer, args=(GameState.screenUpdateQueue,))
getUpdatesFromServerThread.daemon = True
getUpdatesFromServerThread.start()
screenUpdateThread = Thread(target=doScreenUpdates)
screenUpdateThread.daemon = True
screenUpdateThread.start()
sleep(1)
MainGameScreen.main()
# When the eventloop stops, this is ran and sends a disconnect signal to the server, which closes the connection (which does work)
sleep(0.5)
ServerConnect.sendCommandToServer('disconnect')
Заранее спасибо!
Изменить: я нашел проблему. Я думал, что сервер отправляет данные, но на самом деле это не так, он просто не выдавал никаких сообщений об ошибках, поэтому я предположил, что это работает.
receivedUpdate
, потому что в вашем текущем примере вы никуда его не отправляете. - person JohanL   schedule 08.08.2019if len(receivedUpdate) > 0:
, но ничего не произошло - person MiloTier   schedule 08.08.2019connectToServer
— добавьте это к своему вопросу. - person barny   schedule 08.08.2019recv
покорно дает вам все, что есть в наличии, когда вы об этом просите. Ваш код сразу выходит из строя сразу вconnectionResult = client.recv(2048).decode()
и продолжает работать неправильно вreceivedUpdate = client.recv(10000).decode()
. Вы не понимаете, что SOCK_STREAM (TCP) — это протокол потоковой передачи, вместо этого вы притворяетесь, что это протокол сообщений. Это не так, и это не сработает. - person President James K. Polk   schedule 08.08.2019