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

时间:2011-11-25 19:06:52

标签: python sockets

我需要在新线程中打开套接字连接。这种联系需要保持开放。然后我需要能够从主范围向套接字发送数据。

我感觉我的代码发生了什么,线程正在完成&立即关闭套接字,然后就没有可以发送数据的属性。

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

(如果我从中获取线程,它可以正常工作。)

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

以下是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')

3 个答案:

答案 0 :(得分:1)

您可能会发现this post中的示例很有用 - 它演示了一个执行套接字通信的线程,它通过Queue个对象从另一个线程接收命令。这是一个非常通用的样本,有很好的文档记录(在评论和链接的博客文章中),您可以轻松地将其用于任何特定目的。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

那里的竞争条件!

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

您应该使用主线程执行某种 rendevouz ,这样在创建和监听套接字后它才会调用sendData。