【问题标题】:Strange socket problem in python 3.2python 3.2中的奇怪套接字问题
【发布时间】:2011-08-19 22:21:29
【问题描述】:

我目前正在用 python 制作一个聊天应用程序。 它是这样工作的: 1.服务器正常工作 2.客户输入他们的ID和密码 3.登录信息由服务器检查 4.他们被服务器分配一个随机数 5. 他们现在可以向服务器发送和接收消息

我在接收 ID 和通行证时遇到问题(请不要怪我使用 global 和 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)

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

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

在我的 Linux 计算机(mint 11)上,与 Dropbox 共享文件并使用 python (2.7) 打开不会给我任何错误

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

【问题讨论】:

  • 用“请不要怪我使用 global 和 exec”来寻求帮助就像在建筑项目中寻求帮助并说“请不要怪我使用土豆泥而不是干墙”。

标签: python sockets version


【解决方案1】:

哎哟哎哟。

关于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 的东西。

【讨论】:

  • 感谢您的想法,我使用了它们,我的项目又开始工作了。非常感谢楼主
【解决方案2】:

尽量不要使用 exec。

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

我认为在工作中对全球员工和本地员工存在很大的误解 这里。首先,如果numbers没有在 本地(函数)范围,则无需将它们声明为 globals 因为它们只会被读取。其次,为什么sockname# 需要是本地范围内的 sockname#。它可能只是袜子名称

也许您来自一种没有与 Python 相同范围界定的语言?如果是这样,如果您花时间熟悉 Python 中本地和全局范围之间的区别,您的生活会轻松得多。

【讨论】:

  • 感谢您的回答,但我仍然不明白我在哪里使用了 logindata。编辑:我已经为错误添加了完整的回溯。
  • 糟糕,错过了执行官,抱歉。你为什么使用执行程序?正在更新答案。
  • @serban:在logindata=logindata.decode() 中,第一个logindata 是分配的目标,第二个是逻辑上位于分配之前的“用法”。这就是异常的来源。
猜你喜欢
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 2016-03-04
相关资源
最近更新 更多