2011-08-19 68 views
-2

我目前正在python中创建一个聊天应用程序。 它的工作原理是这样的:1 服务器工作 2.客户输入自己的ID和密码 3.登录信息被 他们正在由服务器分配一个随机数的服务器检查 5.他们可以现在send和recv消息往返于服务器Python中的奇怪插座问题3.2

我在收到ID和通行证有问题(请不要怪我使用全局和exec)

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) 

我使用python 3.2在Windows上运行脚本时,当登录数据将normaly有一个值,现在它的未分配

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

在我的Linux计算机(薄荷11),共享文件与保险箱和开放与蟒蛇(2.7)不给我任何错误

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

+6

寻求“请不要责怪我使用全球和可执行”的帮助就像是在寻求建设项目的帮助,并说“请不要责怪我使用土豆泥而不是石膏板”。 –

回答

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中本地和全局范围的区别,你的生活将变得更加容易。

+0

感谢您的答案,但我仍然不明白我在哪里使用logindata。编辑:我已经完全追溯到错误。 –

+0

糟糕,错过了高管,对不起。你为什么使用exec?更新答案。 –

+1

@serban:在'logindata = logindata.decode()'中,第一个'logindata'是一个赋值的目标,第二个是逻辑上在赋值之前出现的“用法”。这是例外来自什么。 – glglgl