Python - 在多个函数中使用相同的套接字

时间:2015-02-20 00:29:11

标签: python sockets

我正在尝试跨多个函数使用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()

我认为这与套接字不是全局的事实有关吗?提前感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

您的错误并非具体,因为套接字不是“全局”。这是因为您在s函数中引用的clientWait不是s函数中的局部变量client。你已经在其他地方创建了它(并没有向我们展示过)。

请不要让你的套接字“全局”。只需从client函数返回,然后将其传递到clientWait函数。

您应该考虑使用classes重构代码,并将大部分变量instance variables。看起来你正在使用全局变量,这会使你的程序变得脆弱,难以理解,难以测试,难以记录等等。

答案 1 :(得分:0)

事实证明我所要做的就是在给它一个值之前将s声明为全局。所以:

global s
s = ...

再次感谢所有答案,谢谢Gerrat的帮助。