python asyncore客户端示例

时间:2017-01-18 10:00:35

标签: python sockets

我试图在python中实现异步TCP客户端 - 服务器模型。这是我使用asyncore模块的第一个例子,如果有人能提供我,我需要一些解释。

我有以下要求: [客户端]

  1. 启动客户端实例 - 如果服务器正在运行则连接到服务器,否则等待服务器启动。
  2. 我需要从服务器接收/传输数据。
  3. 只要在套接字上收到数据,就会通知我。
  4. 我尝试从网上运行示例,但有些疑惑:

    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. 如果数据可供读取,调度程序类如何通知 来自socket。在这种情况下是否调用了handle_read?
    2. 这是一个繁忙的民意调查机制吗?即使插座是,它会吃掉我的整个CPU吗? 坐着闲着?
    3. 以上示例不等待服务器出现。怎么办呢?
    4. 如何从客户端向套接字写入数据?

1 个答案:

答案 0 :(得分:0)

我知道这是旧的,但可能对某人有用:

http://effbot.org/librarybook/asyncore.htm