我需要在新线程中打开套接字连接。这种联系需要保持开放。然后我需要能够从主范围向套接字发送数据。
我感觉我的代码发生了什么,线程正在完成&立即关闭套接字,然后就没有可以发送数据的属性。
如何保持线程&套接字打开以接收从主范围发出的数据?
(如果我从中获取线程,它可以正常工作。)
以下是我正在使用的代码和输出。
以下是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')
答案 0 :(得分:1)
您可能会发现this post中的示例很有用 - 它演示了一个执行套接字通信的线程,它通过Queue
个对象从另一个线程接收命令。这是一个非常通用的样本,有很好的文档记录(在评论和链接的博客文章中),您可以轻松地将其用于任何特定目的。
答案 1 :(得分:1)
当Thread的run方法退出时,线程就会死掉。所以在mt.start()
之后你的线程只会存在很短的时间。您的主线程也会调用mt.sendData()
。您需要在run()方法中循环以保持套接字打开,并使用诸如Queue之类的机制将工作传递给线程。
答案 2 :(得分:0)
那里的竞争条件!
您正在尝试在创建套接字之前发送数据,这就是为什么它仍然是None
。
您应该使用主线程执行某种 rendevouz ,这样在创建和监听套接字后它才会调用sendData。