2014-10-31 53 views
1

我正在處理通過套接字連接的兩個客戶端處理的數字猜測遊戲,但由於某種原因,在初始循環後它停止工作並且不發送/接收任何東西。代碼在第一次執行時都會正常運行,但無論我更改了什麼,第二次我都會在服務器文件的guessNumber = int(s.recv(4096).decode()行發生錯誤 - 它會報告嘗試將''更改爲int的錯誤。這意味着它沒有收到值(在這些情況下,客戶端程序也沒有收到"What is your guess? "字符串)。 但是,下面的代碼只是在初始循環之後沒有做任何事情,如果您猜測第一個循環的編號,那麼它可以正常工作,您的分數被寫入文件,並且它們都以它們應該結束的方式結束。Python套接字服務器/客戶端不循環

但是,如果你不這樣做,它也不會做任何事情,所以任何幫助,將不勝感激。它使用IDLE IDE在Python 3.4.2中運行。

服務器:

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次迭代,再次停止在同一點工作。我確定它正在運行代碼以將提示從服務器發送到客戶端,但是客戶端沒有收到它,所以沒有發送結果,導致服務器和客戶端達到僵局 – 2014-11-02 20:12:38

回答

0

原來的客戶端已關閉它的第一個循環之後插座,因爲它與接收端。我在每次收到後都會添加一些發送確認信息,告訴服務器它已成功執行,現在全部按預期工作!

相關問題