线程套接字函数弄乱了局部变量

德龙

我正在使用TCP在Python中制作一个小型测试服务器。套接字正在阻塞,但是我认为套接字与该问题无关。我知道当前的解决方案有点丑陋和混乱,但这是经过大量的测试和调整后才能看到有效的方法和无效的方法。

该函数在类中为每个客户端的线程中运行。

每个客户端(一个类)都具有一个名称和其他一些较早设置的无关内容。

问题是,无论何时我连接了两个或更多客户端,客户端变量都将设置为最后添加的客户端,在本例中为Computer2。您还可以看到index变量永远不会受到影响。

这是代码:

def recieveDataFromClient(self, sock, index):
    while True:
        client = self.clients[index]
        recvStr = sock.recv(1024).decode()
        if not recvStr:
            break
        if client.name:
            print("got something from "+client.name+" on "+str(sock))
            print("Clients:")
            for client in self.clients:
                print(client.name)
            print("this client is: "+str(index)+" - "+self.clients[index].name+" aka "+client.name)

这是从Computer1发送时的输出:

got something from Computer1 on <socket.socket object, fd=1044, family=2, type=1, proto=0>
Clients:
Computer1
Computer2
this client is: 0 - Computer1 aka Computer2

这是从Computer2发送时的输出:

got something from Computer2 on <socket.socket object, fd=1100, family=2, type=1, proto=0>
Clients:
Computer1
Computer2
this client is: 1 - Computer2 aka Computer2
损害

您不小心覆盖了client变量:

  client = self.clients[index]  # You assign client here
    recvStr = sock.recv(1024).decode()
    if not recvStr:
        break
    if client.name:
        print("got something from "+client.name+" on "+str(sock))
        print("Clients:")
        for client in self.clients:  # You're stomping on it here
            print(client.name)
        # Now when you use client below, its whatever came last in the for loop.
        print("this client is: "+str(index)+" - "+self.clients[index].name+" aka "+client.name)

只需在for循环中使用其他名称即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++ Lambda捕获弄乱了局部变量值

Zip() 函数返回 UnboundLocalError:赋值前引用了局部变量“zip”

Flask 和线程切换布尔变量:UnboundLocalError:赋值前引用了局部变量“test”

UnboundLocalError:赋值前引用了局部变量“readlgt”

UnboundLocalError:赋值之前引用了局部变量“ cars”

UnboundLocalError:赋值前引用了局部变量“strdate”

ipython%timeit“分配前引用了局部变量'a'

UnboundLocalError:分配前引用了局部变量“pin”

UnboundLocalError:赋值之前引用了局部变量“ e”

UnboundLocalError:赋值前引用了局部变量“depcoord”

UnboundLocalError:在赋值之前引用了局部变量 <function>

PyCharm警告可能引用了局部变量

UnboundLocalError:赋值前引用了局部变量“med”

麻烦:UnboundLocalError:赋值之前引用了局部变量

UnboundLocalError:赋值前引用了局部变量“检查”

UnboundLocalError:赋值前引用了局部变量“photoshop”

赋值之前引用了局部变量“ n”。关闭

'UnboundLocalError:赋值之前引用了局部变量'lower'

UnboundLocalError:在赋值之前引用了局部变量“标签”

UnboundLocalError:赋值前引用了局部变量“照片”

UnboundLocalError:在赋值之前引用了局部变量 <var>

如果重新分配了局部变量,它会保持局部变量吗?

UnboundLocalError:在创建构造函数后在成员函数中赋值之前引用了局部变量“温度”?

requestAnimationFrame弄乱了从另一个函数发送来的局部变量以在画布上渲染

全局变量变为局部--UnboundLocalError:赋值之前引用了局部变量

如何修复未绑定的局部错误:赋值前引用了局部变量“answer”

线程函数中的局部变量是否根据线程有单独的副本?

局部变量是线程安全的吗?

线程局部变量和fs段