Python错误ValueError:以10为基数的int()的文本无效'';

Python错误ValueError:以10为基数的int()的文本无效'';,python,Python,我是Python3.3的新手,现在开始编写一个使用套接字的猜测游戏。但是,我不断得到错误ValueError:int()的无效文本,以10为基数:“” 我不明白为什么我在currentGuess=int(currentGuess)一行中出现了这个错误,因为我前面的代码中有一行类似的代码。如果有人能帮助我,我将非常感激。这是我的服务器和客户端代码。我已经考虑过其他类似问题的解决方案,但我找不到任何适合我的方案 服务器 #!/usr/bin/python import random

我是Python3.3的新手,现在开始编写一个使用套接字的猜测游戏。但是,我不断得到错误
ValueError:int()的无效文本,以10为基数:“”

我不明白为什么我在
currentGuess=int(currentGuess)
一行中出现了这个错误,因为我前面的代码中有一行类似的代码。如果有人能帮助我,我将非常感激。这是我的服务器和客户端代码。我已经考虑过其他类似问题的解决方案,但我找不到任何适合我的方案

服务器

    #!/usr/bin/python
    import random
    import sys
    import math
    import  socket

    l = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    l.bind(("127.0.0.1", 4007))
    l.listen(5)
    print("Waiting...")
    while True:
          (s,  ca) = l.accept()
          print("Connection  from",  ca)

          #Name
          s.send("What is your name?". encode())
          names = s.recv(1024).decode()
          #Guesses

          s.send("How many guesses would you like?".encode())
          guesses = s.recv(1024).decode()
          guesses = int(guesses)
          #Random Number

          correctNumber = random.randrange(0,10)
          print(correctNumber)

          #Make Guesses
          count = 0
          while count < guesses:
                s.send("Take a Guess".encode())
                currentGuess = s.recv(1024).decode()
                currentGuess = int(currentGuess)
                if currentGuess == correctNumber:
                   s.send("You WIN".encode())
                if currentGuess != correctNumber:
                   s.send("Incorrect, Try Again ".encode())
                   count = count + 1

    s.close()

当您尝试对空字符串调用
int
时,会出现该错误:

>>> int("")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''

currentGuess
正在设置为
'
。也就是说,
s.recv(1024)
正在返回一个空字符串。这仅在连接关闭时发生,因此表示客户端已停止向服务器发送数据。

s.recv()
获取空字符串意味着另一方在连接上称为
close
shutdown
(或者以其他方式中断,另一方退出,或者有人拔出了以太网线)

看看你的服务器代码,如果你说你想猜3次,它会尝试
recv
3次……但是客户端只
send
一次,之后它将
关闭连接。这意味着服务器上的下一个
recv
将返回一个空字符串,这正是你看到的

要解决此问题,您需要发送尽可能多的猜测,就像另一方所期望的那样。如下所示:

#Make Guesses
for i in range(int(guesses)):
    print(s.recv(1024).decode())
    currentGuess = sys.stdin.readline()
    s.send(currentGuess.encode())
    print(s.recv(80).decode())
s.close()
s.connect(("127.0.0.1", 4007))
f = s.makefile('r+b')

同时,虽然它没有引起这个特殊问题,但您的代码不能可靠地工作。无法保证每个
send
都会与另一侧的
recv
匹配。在某些平台上,当您使用本地主机,发送小消息,并且不太快地发送消息,所有事情都在正常工作。在其他平台上,大部分时间正常工作,但偶尔不正常。在其他平台上,它们经常失败

除此之外,正如我们所解释的,
send
永远不能保证发送其整个字符串;这就是它返回实际发送的字节数的原因。您可以通过使用解决此问题,但这对其他问题没有帮助

您必须通过设计和实现协议,在TCP字节流的基础上构建一个消息流。这听起来可能很可怕,但一个非常简单的协议“所有消息都以换行符结尾”,只需使用以下方法即可实现:

#Make Guesses
for i in range(int(guesses)):
    print(s.recv(1024).decode())
    currentGuess = sys.stdin.readline()
    s.send(currentGuess.encode())
    print(s.recv(80).decode())
s.close()
s.connect(("127.0.0.1", 4007))
f = s.makefile('r+b')
现在,每次您执行以下任一操作时:

foo = s.recv(80)
s.send(bar)
…相反,请执行以下操作:

foo = f.readline().strip()
f.write(bar + '\n')

最后一个不会影响您但应该解决的问题:

在没有参数的情况下调用
encode
decode
几乎总是一个坏主意,尤其是对于网络字节。您要求Python使用发生在
sys.getdefaultencoding()中的任何内容对数据进行解码
。您能确保客户端和服务器上的默认编码是相同的吗?您能确保它可以处理用户可能键入的任何内容吗?在典型的Windows计算机上,它可能类似于
'cp1252'
,这意味着如果用户键入一个汉字,客户端将以
Unicode错误退出,这是不正确的非常用户友好。正确的做法是显式使用
'utf-8'
(这意味着您的协议现在是“所有消息都在utf-8中,并以换行符结尾”)

如果您按照上面的建议使用
makefile
,您可以通过让file对象为您进行编码来更轻松地解决此问题。只需执行以下操作:

f = s.makefile('r+', encoding='utf-8')

然后,您可以省去所有的
解码
编码
调用。

在我看来,您只发送了一次猜测,因此您的客户端代码中也需要一个循环。感谢这真的帮了我解决了最初的问题,并感谢您提供了额外的提示。就像我说的,只是一个初学者,所以这是一个学习曲线,感谢gre解释things@ProgrammingRookie:做一个初学者没什么错。你可能有更多的东西要学,但你也少了一些过时的坏习惯要改掉