Форум сайта python.su
Возник вопрос при организации многопоточного приложения в работе с сокетами. Имеется сервер, который слушает сокет и при подключении клиента создает на стороне сервера объект клиента (отдельной нити естесно). Этот объект начинает самостоятельно отслеживать сокет соединение.
Вот выдержки из кода:
def run(self):
“старт объекта клиента”
while 1:
data = self.get()
if data:
self._appManager.InvokeApp(data)
def get(self):
“слушаем клиента и принимаем от него данные”
data = ‘'
try:
while 1:
zipData = self._data_socket.recv(4)
if zipData == ’' :
break
data = data+zipData
except:
self._logger.critical('Error while recieving package from client')
self.__del__()
self._logger.info('Get data complete succesful')
return pickle.loads(zlib.decompress(data))
проблемы возникают в методе get в цикле который принимает данные. После того как пакет полностью передался, выход из цикла не происходит, а просто recv ожидает следующего пакета. В доке http://www.amk.ca/python/howto/sockets/ сказано, что для решения этой проблемы необходимо передавать длину пакета. Но возможно существуют иные методы решения?
Офлайн
Возможны несколько вариантов:
передавать длинну пакета,
передавать признак конца,
после передачи клиент закрывает конект.
Офлайн
Последний вариант наверняка не подходит потомучто мне необходимо удерживать соединение до тех пор, пока клиент не закроет приложение.
Второй вариант тоже не особо подходит, потому как данные компресятся и передаются в серелизированной форме, поэтому там могут быть какие угодно символы и наверняка подобрать символ завершения пакета не удастся. Я могу конечно ошибаться.
Используя первый вариант, как можна передать длину пакета, если я как уже писал, передаю данные в последовательной форме в заархивированном виде?
Офлайн
Можно, например, перед твоими запакованными данными вставлять сериализованный, но не запакованный, int.
Офлайн
Уже так и сделал, спасибо
Офлайн
Здравствуйте у меня такая проблема. Надо написать бота который бы обходит веб-страницы и сохранял бы их.
Есть массив запросов.
queries -> GET /index.php?id=0
queries -> GET /index.php?id=1
…
queries -> GET /index.php?id=10
есть ф-ция получения страниц по запросу через прокси:
def get_page(proxy,port,header):Проблема в том чтобы переписать ее так чтобы он ее использовать в n потоков. Помогите пожалуйста. Заранее благодарен.
page='' #Полученная страница
buff='1';
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((proxy,port))
sock.send(header)
while buff:
buff=sock.recv(1024)
if buff:
page+=buff
sock.close()
return(page)
Отредактировано (Янв. 22, 2007 23:51:17)
Офлайн
Офлайн
На мой взгляд идея примерно такова:
pages # список объектов страниц
#наполняем список объектами
for query in queries:
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((proxy,port))
pages.append(Page(sock, header))
pages.setDaemon(1)
# стартуем нить
pages.start()
class Page(threading.Thread)
def __init__(self, dataSocket, header):
threading.Thread.__init__(self, name='pageThread')
self._dataSocket = dataSocket
self._pageContent = ''
self._header = header
self._complete = False # завершение обработки
def run(self):
“переопределяем run”
self._dataSocket.send(self._header)
while buff:
buff=self._dataSocket.recv(1024)
if buff:
self._pageContent+=buff
self._complete = True
def __del__(self):
“грохнуть объект”
self._dataSocket.close()
thread.exit()
В коде могут быть ошибки, писал по быстрому =)
Отредактировано (Янв. 23, 2007 09:56:15)
Офлайн