在线程中保持套接字打开,从主线程发送命令

2 投票
3 回答
7359 浏览
提问于 2025-04-17 07:04

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

我感觉我的代码出现的问题是,线程完成后立即关闭了套接字,这样就没有地方可以发送数据了。

我该如何保持线程和套接字的打开状态,以便从主程序发送数据呢?

(如果我去掉线程,这段代码就能正常工作。)

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

这是从命令行得到的输出:

$ 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')

3 个回答

0

这里有个竞争条件!

你在尝试发送数据的时候,套接字还没创建好,所以它的值还是None

你应该和主线程做个“约定”,确保只有在套接字创建并开始监听之后,才去调用发送数据的操作。

1

当一个线程的运行方法结束时,这个线程就结束了。所以在你调用 mt.start() 之后,你的线程只会存在一小段时间。同时,mt.sendData() 也在你的主线程中被调用。你需要在 run() 方法中使用循环来保持连接的打开,并使用像 队列 这样的机制来把工作传递给这个线程。

1

你可以在这篇文章中找到一个很有用的例子——它展示了一个线程如何进行套接字通信,并通过Queue对象从另一个线程接收命令。这是一个比较通用的示例,文档写得很好(无论是注释还是链接的博客文章),你可以很容易地根据自己的需要进行调整。

撰写回答