gpt4 book ai didi

Python错误值Error : invalid literal for int() with base 10 ' '

转载 作者:行者123 更新时间:2023-12-01 05:34:07 27 4
gpt4 key购买 nike

我是 Python 3.3 的新手,我开始使用套接字编写一个小猜谜游戏。但是我不断收到错误 ValueError: invalidliteral for int() with base 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()

客户端

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

s = socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
s.connect(("127.0.0.1", 4007))
print("Wlcome to the numer guessing game")

#Name
print(s.recv(1024).decode())
name = sys.stdin.readline()
s.send(name.encode())

#guesses
print(s.recv(1024).decode())
guesses = sys.stdin.readline()
s.send(guesses.encode())

#Make Guesses
print(s.recv(1024).decode())
currentGuess = sys.stdin.readline()
s.send(currentGuess.encode())
print(s.recv(80).decode())
s.close()

最佳答案

s.recv()返回一个空字符串意味着另一方在连接上调用了closeshutdown(或者它是以其他方式中断——另一方退出,或者有人拔掉了以太网线)。

看看你的服务器代码,如果你说你想要 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()
<小时/>

同时,虽然它不会导致这个特定问题,但您的代码无法可靠地工作。 Sockets are byte streams, not message streams 。无法保证每个 send 都会与另一端的 recv 匹配。 recv 可能会收到一半的 send,或者捆绑在一起的两个 send。在某些平台上,当您使用本地主机并发送小消息,并且发送速度不是太快时,一切都会顺利进行。在其他平台上,大多数情况下一切正常,但有时却无法正常工作。在其他方面,他们经常失败。

除此之外,如 the docs解释一下,send 永远不能保证发送整个字符串;这就是为什么它返回实际发送的字节数。您只需使用 sendall 即可解决此问题,但这无助于解决其他问题。

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

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')
<小时/>

最后一个问题不会影响您,但应该修复:

不带参数调用 encodedecode 几乎总是一个坏主意,尤其是对于网络字节。您要求 Python 使用 sys.getdefaultencoding() 中的任何内容来解码数据。你能确定客户端和服务器上的默认编码是相同的吗?您能确定它可以处理用户可能输入的任何内容吗?在典型的 Windows 机器上,它可能类似于 'cp1252',这意味着如果用户输入中文字符,客户端将退出并显示 UnicodeError,这是'非常人性化。正确的做法是显式使用 'utf-8'。 (这意味着您的协议(protocol)现在是“所有消息均采用 UTF-8 格式,并以换行符结尾。”)

如果您按照上面的建议使用 makefile,则可以通过让文件对象为您进行编码来更轻松地解决此问题。只需这样做:

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

然后您可以省略所有 decodeencode 调用。

关于Python错误值Error : invalid literal for int() with base 10 ' ' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19551589/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com