python 3.2中奇怪的套接字问题

时间:2011-08-19 22:21:29

标签: python sockets version

我目前正在python中创建一个聊天应用程序。 它的工作原理如下: 1.服务器正在运行 2.客户输入他们的ID和密码 3.服务器检查登录信息 4.服务器为它们分配一个随机数 5.他们现在可以从服务器发送和回复消息

我在收到身份证和通行证方面遇到了问题(请不要责怪我使用全球和执行官)

def recv_server():
    global number
    global s     #the tcp socket
    exec("global sock"+number) #creating a specific sock for each connection
    exec("sock"+number+","+"sockname"+number+" = s.accept()")
    exec("logindata=sock"+number+".recv(65535)")
    logindata=logindata.decode()
    ...

代码为1的数字为:

global sock1
sock1, sockname1 = s.accept()
logindata=sock1.recv(65535)

我在Windows上使用python 3.2并且在运行脚本时,当登录数据通常具有值时,现在它是未分配的

File 'abc' line 23, in recv_server
logindata=logindata.decode()
UnboundLocalError: local variable 'logindata' referenced before assigment

在我的Linux电脑上(薄荷11),用dropbox共享文件并用python(2.7)打开不会给我任何错误

现在我问是否有人知道这个问题的原因是什么?

2 个答案:

答案 0 :(得分:2)

哎哟哎哟。

关于global的内容,我让你纠正,但

def recv_server():
    global number
    global s     #the tcp socket
    global sockets
    sockets[number], sockname = s.accept()
    logindata = sockets[number].recv(65535)
    logindata = logindata.decode()
    ...

定义了sockets可能sockets = {}左右至少会尝试合理编码。

然后exec消失,只有global停留,这是恕我直言不好,但不像另一个那么难看。

您的错误源于编译器因为logindata内容而无法识别exec的第一次分配。

答案 1 :(得分:1)

根本不要使用exec。

def recv_server():
    globals()["sock"+number], locals()["sockname"+number] = s.accept()
    logindata = locals()["sock"+number].recv(65535)
    logindata=logindata.decode()

我认为全球人和当地人在工作中存在很大的误解 这里。首先,如果未分配numbers 本地(函数)范围,那么就没有必要将它们声明为 global因为它们只会被阅读。其次,为什么doess sockname# 需要在本地范围内使用sockname#。它可能只是sockname

也许你是来自一种与Python不同的语言?如果是这样的话,如果你花时间熟悉Python中本地和全局范围之间的区别,那么你的生活会更容易。