在线程中保持套接字打开,从主线程发送命令
我需要在一个新的线程中打开一个套接字连接。这个连接需要保持打开状态。然后,我需要能够从主程序中向这个套接字发送数据。
我感觉我的代码出现的问题是,线程完成后立即关闭了套接字,这样就没有地方可以发送数据了。
我该如何保持线程和套接字的打开状态,以便从主程序发送数据呢?
(如果我去掉线程,这段代码就能正常工作。)
下面是我正在使用的代码和输出。
这是从命令行得到的输出:
$ 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
对象从另一个线程接收命令。这是一个比较通用的示例,文档写得很好(无论是注释还是链接的博客文章),你可以很容易地根据自己的需要进行调整。