事件驱动IO-tcp
来源:互联网 发布:软件系统开发评估 编辑:程序博客网 时间:2024/06/15 04:07
s.py
import socketimport timeimport selectclass EventHandler: def fileno(self): 'Return the associated file descriptor' raise NotImplemented('must implement') def wants_to_receive(self): 'Return True if receiving is allowed' return False def handle_receive(self): 'Perform the receive operation' pass def wants_to_send(self): 'Return True if sending is requested' return False def handle_send(self): 'Send outgoing data' passclass TCPServer(EventHandler): def __init__(self, address, client_handler, handler_list): self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) self.sock.bind(address) self.sock.listen(1) self.client_handler = client_handler self.handler_list = handler_list def fileno(self): return self.sock.fileno() def wants_to_receive(self): return True def handle_receive(self): client, addr = self.sock.accept() # Add the client to the event loop's handler list self.handler_list.append(self.client_handler(client, self.handler_list)) print('''Add the client to the event loop's handler list.''')class TCPEchoClient(EventHandler): def __init__(self, sock, handler_list): self.sock = sock self.handler_list = handler_list self.outgoing = bytearray() def wants_to_receive(self): return True def handle_receive(self): data = self.sock.recv(8192) if not data: self.close() else: self.outgoing.extend(data) print (data) def fileno(self): return self.sock.fileno() def close(self): self.sock.close() # Remove myself from the event loop's handler list self.handler_list.remove(self) def wants_to_send(self): return True if self.outgoing else False def handle_send(self): nsent = self.sock.send(self.outgoing) print (self.outgoing) self.outgoing = self.outgoing[nsent:]def event_loop(handlers): while True: wants_recv = [h for h in handlers if h.wants_to_receive()] wants_send = [h for h in handlers if h.wants_to_send()] can_recv, can_send, _ = select.select(wants_recv, wants_send, []) for h in can_recv: h.handle_receive() for h in can_send: h.handle_send()if __name__ == '__main__': handlers = [] handlers.append(TCPServer(('', 15000), TCPEchoClient, handlers)) event_loop(handlers)
c.py
from socket import *s = socket(AF_INET, SOCK_STREAM)s.connect(('localhost', 15000))s.send(b'hello')print(s.recv(128))
0 0
- 事件驱动IO-tcp
- 事件驱动IO-udp
- 事件驱动与异步IO
- 论事件驱动与异步IO
- python(十)下:事件驱动与 阻塞IO、非阻塞IO、IO多路复用、异步IO
- 关于事件驱动的学习一 异步IO aio
- 使用gtk+的iochannel进行事件驱动IO操作
- 驱动基础知识-怎么访问io,中断,产生线程,事件
- Netty 基于事件驱动模型实现的异步IO
- 根据cookbook, 多线程情况的事件驱动IO
- Nodejs的单线程、异步IO与事件驱动
- python——异步IO与事件驱动
- Nodejs之事件驱动+非阻塞io模型
- 网络编程五种IO模型之重叠IO模型-事件驱动
- 事件Io
- 事件驱动
- 事件驱动
- 事件驱动
- centos7 无法启动网络(service network restart)错误解决办法
- 试水Bilibili/ijkplayer-Android-Demo
- WPF的DataGrid的使用技巧—列宽调整和列排序问题
- 2017年初BAT的JAVA面试题汇集
- Python相关安装集锦(陆续更新)
- 事件驱动IO-tcp
- Coding 没有止境
- android 金额
- 知识点
- html中提交表单并实现不跳转页面处理返回值
- 【解决】springmvc 前台表单提交数据返回400错误
- ARM学习笔记3
- thinkphp js路径问题
- fcntl()系统调用