Я работаю над игрой, угадывающей несколько клиентов, подключенной через сокет, но по какой-то причине после начального цикла он перестает работать и ничего не посылает/не получает. Код все выполняется отлично в первый раз, но независимо от того, что я меняю, во второй раз я либо получаю сообщение об ошибке в строке guessNumber = int(s.recv(4096).decode()
в файле сервера - там, где он сообщает об ошибке, пытающейся изменить ''
в int. Это означает, что он не получает значение (в этих случаях клиентская программа также не получает строку "What is your guess? "
). Приведенный ниже код ничего не делает после этого начального цикла. Если вы угадываете номер в этом первом цикле, тогда он отлично работает, ваш счет записывается в файл, и оба они заканчиваются так, как должны.Python socket server/client not looping
Но если вы этого не сделаете, это тоже не поможет, поэтому любая помощь будет оценена. Он работает в Python 3.4.2 с использованием IDLE IDE.
Сервер:
import socket
import random
l = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
score = 0
guessNumber = 0
def within(value, goal, n):
numDifference = abs(value - goal)
if (numDifference <= n):
return True
else:
return False
scoreFile = open('scores', 'a')
randomNumber = random.randrange(0, 11)
l.bind(("127.0.0.1", 4001))
l.listen(5)
print("Waiting...")
while True:
(s,ca)=l.accept()
print("Connection from", ca)
while (not(within(guessNumber, randomNumber, 0))):
s.sendall("What is your guess? ".encode())
guessNumber = int(s.recv(4096).decode())
score += 1
print ("%d" % guessNumber)
if (within(guessNumber, randomNumber, 0)):
s.sendall(("You guessed correctly! \n Your score is %d" % score).encode())
scoreFile.write("Player %s has a score of %d \n" % (ca, score))
scoreFile.close()
s.sendall("1".encode())
elif (within(guessNumber, randomNumber, 3)):
s.sendall("You are getting close!".encode())
s.sendall("0".encode())
else:
s.sendall("You are way off".encode())
s.sendall("0".encode())
s.close()
Клиент:
import socket
gameOver = False
guessNumber = 0
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 4001))
while (gameOver != "1"):
#Send guess
guessNumber = input(s.recv(4096).decode())
s.sendall(guessNumber.encode())
#Recieve result
print(s.recv(4096).decode())
#Check whether game is over or not
gameOver = s.recv(4096).decode()
print ("Game Over")
s.close()
Я попытался запустить их через Visual Studio 2013, теперь он будет работать для 2 ~ 3 итераций, прежде чем, снова, прекратив работу в той же точке. Я решил, что он запускает код для отправки приглашения с сервера клиенту, но затем клиент не получает его и поэтому не отправляет результат, заставляя как сервер, так и клиент достичь тупика –