Python socket 服务器/客户端不循环

1 投票
1 回答
1215 浏览
提问于 2025-04-30 22:20

我正在做一个数字猜谜游戏,这个游戏是通过两个客户端连接的套接字来处理的。但是不知为什么,在第一次循环之后,它就停止工作了,无法发送或接收任何东西。代码在第一次运行时一切正常,但无论我怎么改,第二次运行时,我总是在服务器文件的这一行出错:guessNumber = int(s.recv(4096).decode(),它报告说试图把''(空字符串)转换成整数时出错。这说明它没有接收到任何值(在这种情况下,客户端程序也没有收到"What is your guess? "这个提示字符串)。

不过,下面的代码在第一次循环之后就不再做任何事情了。如果你在第一次循环中猜对了数字,那就没问题,你的分数会被写入文件,游戏也会正常结束。

但是如果你没有猜对,它也不会有任何反应,所以任何帮助都非常感谢。这个程序是在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()   
暂无标签

1 个回答

0

原来客户端在第一次循环后就关闭了它的连接,因为那次操作是接收数据。我在每次接收到数据后添加了一些发送确认信息,这样就可以告诉服务器这次接收成功了,现在一切都正常运作了!

撰写回答