2014-10-31 3 views
1

Я работаю над игрой, угадывающей несколько клиентов, подключенной через сокет, но по какой-то причине после начального цикла он перестает работать и ничего не посылает/не получает. Код все выполняется отлично в первый раз, но независимо от того, что я меняю, во второй раз я либо получаю сообщение об ошибке в строке 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() 
+0

Я попытался запустить их через Visual Studio 2013, теперь он будет работать для 2 ~ 3 итераций, прежде чем, снова, прекратив работу в той же точке. Я решил, что он запускает код для отправки приглашения с сервера клиенту, но затем клиент не получает его и поэтому не отправляет результат, заставляя как сервер, так и клиент достичь тупика –

ответ

0

Оказывается, клиент закрывал это гнездо после первой итерации, так как она закончилась с приемом. Я добавил несколько подтверждений отправки после каждого получения, чтобы сообщить серверу, что он был успешно выполнен, и теперь все работает по назначению!