我正在尝试跨多个函数使用python套接字,但我不确定如何。我收到错误:
Traceback (most recent call last):
File "C:\Users\User\Desktop\PyBattle.py", line 169, in <module>
client()
File "C:\Users\User\Desktop\PyBattle.py", line 157, in client
clientWait()
File "C:\Users\User\Desktop\PyBattle.py", line 107, in clientWait
data = s.recv(BUFFER_SIZE)
File "C:\Python27\lib\socket.py", line 170, in _dummy
raise error(EBADF, 'Bad file descriptor')
error: [Errno 9] Bad file descriptor
以下是客户端功能的一部分:
def client():
print "Enter server IP."
TCP_IP = raw_input(">")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
这是clientWait函数:
def clientWait():
os.system("cls")
print "Not your turn."
print "Username:" + username + " HP:" + str(hp) + " Level:" + str(level) + " Attack:" + str(attack) + " Defence:" + str(defence) + " Speed:" + str(speed)
print "Opponent:" + opponentUsername + " HP:" + str(opponentHp) + " Level:" + str(opponentLevel) + " Attack:" + str(opponentAttack) + " Defence:" + str(opponentDefence) + " Speed:" + str(opponentSpeed)
data = s.recv(BUFFER_SIZE)
clientProcess()
我认为这与套接字不是全局的事实有关吗?提前感谢你的帮助。
答案 0 :(得分:0)
您的错误并非具体,因为套接字不是“全局”。这是因为您在s
函数中引用的clientWait
不是s
函数中的局部变量client
。你已经在其他地方创建了它(并没有向我们展示过)。
请不要让你的套接字“全局”。只需从client
函数返回,然后将其传递到clientWait
函数。
您应该考虑使用classes重构代码,并将大部分变量instance variables。看起来你正在使用全局变量,这会使你的程序变得脆弱,难以理解,难以测试,难以记录等等。
答案 1 :(得分:0)
事实证明我所要做的就是在给它一个值之前将s声明为全局。所以:
global s
s = ...
再次感谢所有答案,谢谢Gerrat的帮助。