【问题标题】:Keeping a socket opened in a thread, and sending commands from Main保持在线程中打开的套接字,并从 Main 发送命令
【发布时间】:2011-11-25 19:06:52
【问题描述】:

我需要在一个新线程中打开一个套接字连接。该连接需要保持打开状态。然后我需要能够从主范围向套接字发送数据。

我感觉我的代码正在发生的事情是线程正在完成并立即关闭套接字,然后没有可以向其发送数据的属性。

如何保持线程和套接字打开以接收从主范围发出的数据?

(如果我去掉这个线程,它工作正常。)

下面是我正在使用的代码和输出。

这是shell的输出:

$ python test.py 
Traceback (most recent call last):
  File "test.py", line 25, in <module>
    packet = mt.sendData('somedata')
  File "test.py", line 19, in sendData
    self.mySocket.send(myString)
AttributeError: 'NoneType' object has no attribute 'send'

这是代码

注意第 19 行是:self.mySocket.send(myString) 第 25 行是:packet = mt.sendData('somedata')

import threading
import socket

class MyTest(threading.Thread):
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.mySocket = None
        threading.Thread.__init__(self)

    def run(self):
        #open socket
        self.mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.mySocket.connect( ( self.host, self.port ) )
        self.mySocket.setblocking(1)

    def sendData(self, myString):
        # send data to socket
        self.mySocket.send(myString)
        packet = self.mySocket.recv(4096)


mt = MyTest('127.0.0.1', 50001)
mt.start()
packet = mt.sendData('somedata')

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    您可能会发现this post 中的示例很有用——它演示了一个执行套接字通信的线程,该线程通过Queue 对象从另一个线程接收命令。这是一个相当通用的示例,有据可查(在 cmets 和链接的博客文章中),您可以轻松地将其修改为任何特定目的。

    【讨论】:

    • 这段代码对 Eli 非常有帮助。我花了最后一两个小时来实施和理解每一行,这非常清楚。谢谢!
    • 我将 socketclient 作为类“MyController”的成员。然后我有一个连接到各种服务器的 MyController 对象的字典。我发现一旦我创建了第二个 MyController(这意味着第二个 socketclient),其中一个 socketclient 对象就会失去它的属性,并且 .socket 是一个无类型,即使我连接了它......所以,问题是:应该我能够按照您编写的方式同时重用其中一些套接字客户端对象吗?如果是这样,我会想办法的。如果没有,请告诉我,这会节省我的一些理智,哈哈。
    • @Coder1:我不确定我理解你的意思。最好为它创建一个新的 StackOverflow 问题,并使用演示问题的最小代码示例。
    • 是的,这是一个非常令人费解的问题,呵呵。我在这里发布了跟进:stackoverflow.com/questions/8282216/… ..再次感谢。
    【解决方案2】:

    当一个线程的运行方法退出时,线程就死掉了。所以在mt.start() 之后,你的线程只会存在很短的时间。 mt.sendData() 也在你的主线程上被调用。您需要循环运行 run() 方法以保持套接字打开,并使用 Queue 等机制将工作传递给线程。

    【讨论】:

      【解决方案3】:

      那里有比赛条件!

      您试图在创建套接字之前发送数据,这就是为什么它仍然是None

      您应该对主线程进行某种rendevouz,以便它仅在创建并监听套接字后调用 sendData。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-25
        • 1970-01-01
        • 2020-01-19
        • 2011-04-19
        • 2012-11-23
        • 2011-09-17
        • 1970-01-01
        相关资源
        最近更新 更多