huashan8 发表于 2017-4-28 13:35:26

python socket 之异步asyncore

  asyncore库是python的一个标准库,它是一个异步socket的包装。我们操作网络的时候可以直接使用socket等底层的库,但是asyncore使得我们可以更加方便的操作网络,避免直接使用socket,select,poll等工具时需要面对的复杂。
  该库主要包括一个函数和一个类
  * loop()函数  -- 全局函数
       asyncore.loop([timeout[, use_poll[, map[, count]]]]) 
       loop()函数负责检测一个dict,dict中保存dispatcher的实例,这个字典被称为channel。每次创建一个dispatcher对象,都会把自己加入到一个默认的dict里面去(当然也可以自己指定channel)。当对象被加入到channel中的时候,socket的行为都已经被定义好,程序只需要调用loop(),一切功能就实现了。
    
  * dispatcher基类 
       
         每一个从dispatcher继承的类的对象,都可以看作我们需要处理的一个socket,可以是TCP连接或者UDP,甚至是其它不常用的。使用容易,我们需要定义一个类,它继承dispatcher,然后我们重写(覆盖)一些方法就可以了。
  示例如下
  Server:

import asyncore
import socket

class EchoHandler(asyncore.dispatcher_with_send):
def handle_read(self):
data = self.recv(1024)
data = data + "\0"
print data
if data:
print "start reback data"
self.send(data)
print "end reback data"

class EchoServer(asyncore.dispatcher):
def __init__(self, host, port):
asyncore.dispatcher.__init__(self)
#self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.create_socket(socket.AF_INET, socket.SOCK_DGRAM)
self.set_reuse_addr()
self.bind((host, port))
#self.listen(5)
self.buffer = None
def handle_accept(self):
pair = self.accept()
if pair is not None:
sock, addr = pair
print 'Incoming connection from %s' % repr(addr)
handler = EchoHandler(sock)
server = EchoServer('',11111)
asyncore.loop()
   
  Client:

import asyncore
import socket
class HTTPClient(asyncore.dispatcher):
def __init__(self):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_DGRAM)
self.bind(("", 11112))
#self.connect(("localhost", 11111))
self.buffer = bytes('aaaaa')
def handle_connect(self):
pass
def handle_close(self):
self.close()
def handle_read(self):
print(self.recv(8192))
def writable(self):
return (len(self.buffer) > 0)
def handle_write(self):
print "start write"
self.socket.sendto(self.buffer, ("127.0.0.1", 11111))
print "end write"
self.buffer = ""

client = HTTPClient()
asyncore.loop()
   
     
页: [1]
查看完整版本: python socket 之异步asyncore