2017-01-18 7 views
0

Я пытаюсь реализовать как асинхронную модель TCP Client-Server в python. Это мой первый пример использования асинхронного модуля, и мне нужно объяснение, если кто-нибудь может предоставить мне.Пример клиента python asyncore

У меня есть следующие требования: [Client]

  1. Инициировать экземпляр клиента - соединиться с сервером, если сервер работает еще ждать сервер придумать.
  2. Мне нужно получить/передать данные с сервера.
  3. Уведомить меня, когда данные получены в гнезде.

Я попытался запустить пример пример из сети, но были некоторые сомнения:

import asyncore 
import logging 
import socket 
from cStringIO import StringIO 
import urlparse 

class Client(asyncore.dispatcher): 

    def __init__(self,host): 
     self.logger = logging.getLogger() 
     self.write_buffer = "" 
     self.read_buffer = StringIO() 
     asyncore.dispatcher.__init__(self) 
     self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 
     address = (host, 80) 
     self.logger.debug('connecting to %s', address) 
     self.connect(address) 

    def handle_connect(self): 
     self.logger.debug('handle_connect()') 

    def handle_close(self): 
     self.logger.debug('handle_close()') 
     self.close() 

    def writable(self): 
     is_writable = (len(self.write_buffer) > 0) 
     if is_writable: 
      self.logger.debug('writable() -> %s', is_writable) 
     return is_writable 

    def readable(self): 
     self.logger.debug('readable() -> True') 
     return True 

    def handle_write(self): 
     sent = self.send(self.write_buffer) 
     self.logger.debug('handle_write() -> "%s"', self.write_buffer[:sent]) 
     self.write_buffer = self.write_buffer[sent:] 

    def handle_read(self): 
     data = self.recv(8192) 
     self.logger.debug('handle_read() -> %d bytes', len(data)) 
     self.read_buffer.write(data) 

if __name__ == '__main__': 
    logging.basicConfig(level=logging.DEBUG, 
         format='%(name)s: %(message)s', 
         ) 

    clients = Client("127.0.0.1") 

    logging.debug('LOOP STARTING') 

    asyncore.loop() 

    logging.debug('LOOP DONE') 
  1. Как диспетчеру класс уведомляет, когда данные доступны для чтения из гнезда. Является ли handle_read в этом сценарии?
  2. Является ли это занятым механизмом опроса? будет ли он потреблять весь мой процессор, даже если разъем сидит без дела?
  3. Вышеприведенный пример не дождался появления сервера. Как это можно сделать?
  4. Как записать данные в сокет от клиента?

ответ

Смежные вопросы