1

ソケットを介して接続された 2 つのクライアントで処理される数推測ゲームに取り組んでいますが、何らかの理由で最初のループの後に動作が停止し、何も送受信しません。コードは最初はすべて正常に実行されますが、何を変更しても、2 回目はサーバー ファイルの行でエラーが発生し、intguessNumber = int(s.recv(4096).decode()に変更しようとするとエラーが報告されます。''これは、値を受け取っていないことを意味します (これらの場合、クライアント プログラムも"What is your guess? "文字列を受け取りません)。ただし、以下のコードは、最初のループの後に何もしません。最初のループで数字を推測すると、正常に機能し、スコアがファイルに書き込まれ、両方とも正常に終了します。

しかし、そうしないと何もしないので、助けていただければ幸いです。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()   
4

1 に答える 1

0

受信で終了したため、最初の反復後にクライアントがソケットを閉じていたことがわかりました。各受信の後にいくつかの送信確認を追加して、サーバーに正常に実行されたことを伝え、すべてが意図したとおりに機能するようになりました!

于 2014-11-06T14:09:39.100 に答える