Сохранение сокета открытым в потоке и отправка команд из Main - PullRequest
1 голос
/ 25 ноября 2011

Мне нужно открыть сокетное соединение в новом потоке.Эта связь должна оставаться открытой.Затем мне нужно иметь возможность отправлять данные в сокет из основной области видимости.

У меня есть ощущение, что с моим кодом происходит то, что поток сразу завершает и закрывает сокет, а затем нет свойств дляотправить данные на.

Как сохранить поток и сокет открытым для получения данных для отправки из основной области?

(Если я выберу поток из этого, он будет работать нормально.)

Ниже приведен код и вывод, с которым я работаю.

Вот вывод из оболочки:

$ 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 ]

1 голос
/ 25 ноября 2011

Когда метод запуска потока завершается, поток умирает.Таким образом, после mt.start() ваша тема будет существовать только в течение короткого времени.mt.sendData() также вызывается в вашем основном потоке.Вам нужно будет зациклить метод run (), чтобы оставить сокет открытым, и использовать механизм, такой как Queue , для передачи работы потоку.

1 голос
/ 25 ноября 2011

Вы можете найти пример в этом посте полезным - он демонстрирует поток, который выполняет команды связи через сокет из другого потока через Queue объекты. Это довольно общий пример, хорошо документированный (как в комментариях, так и в связанном сообщении в блоге), и вы можете легко адаптировать его для любой конкретной цели.

0 голосов
/ 25 ноября 2011

Состояние гонки там!

Вы пытаетесь отправить данные до создания сокета, поэтому он все еще None.

Вы должны сделать что-то вроде rendevouz с основным потоком, чтобы он вызывал sendData только после того, как сокет создан и прослушивает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...