Python:简单select模块使用
来源:互联网 发布:幼儿园床垫淘宝 编辑:程序博客网 时间:2024/05/16 11:18
select 多并发socket 例子
#!/usr/bin/env python#coding:utf-8import selectimport socketimport Queuelisten_addr=('0.0.0.0',8000)#监听服务器server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)try: server.bind(listen_addr) server.setblocking(0)except socket.error as e: print e exit(0)server.listen(500)print("starting up on %s port %s"%listen_addr)inputs=[server,] #监测服务器端,毕竟server本身也是一个fd,文件描述符outputs=[] #这里存放的是内核返回的活跃的客户端连接,就是服务器需给send data的客户端连接message_queue={}#开始循环监测事件while True: print("waiting for next event...") # readable,writeable,exceptionl=select.select(inputs,outputs,inputs)#如果没有任何fd就绪,那么程序一直会阻塞在这里 "可以recv 可以send exception" for s in readable: #每一个s就是一个socket "处理新的客户端连接,并统一接受他们的数据" if s is server: #由于上面我们server自己页当成一个fd放在了inputs列表里,传给了select,如果这个s是select代表这个fd就绪 #如果server就绪,那就说明又有新的客户端的连接到了 client,addr=s.accept() print("new connection from",addr) client.setblocking(0) """有客户端连接进来就把这个连接先放在select列表中, 现在这些列表中的连接都会交给select去监听,如果列表中有一个客户端发来数据 那么这个客户端所连接的对应fd就会转变成就绪状态,select就会将这个就绪状态的连接 返回给用户程序的(即readable中) 最后循环这个readable列表,取出这个连接,并只接受这些数据暂时存放 """ inputs.append(client) #往字典中添加一个队列用于暂时存放这个客户端连接传来的数据 message_queue[client]=Queue.Queue() #如果不是server,那么就是原来连接的客户端有数据来了 else: #接受 data=s.recv(1024) if data: print("receive come from %s",s.getpeername()[0],data) message_queue[s].put(data) #收到的数据先放到对应的queue中,一会返回数据给客户端 if s not in outputs: outputs.append(s) #为了不影响处理与其他客户端的连接。这里不立刻返回数据给客户端, 先放着,等会一起处理发送数据 else: #如果没有收到客户端的数据,表示客户端断开了 print("client connection break") if s in outputs: outputs.remove(s) #清除已经断开的连接,没不会有信息发送给客户端了 inputs.remove(s) del message_queue[s] for s in writeable: #现在处理没有处理完客户端连接,就是接着前面向客户端发送数据 try: next_msg=message_queue[s].get_nowait() #从队列中删除这个项目并伴随没有阻塞的返回这个项目(get) except Queue.Empty: print("client [%s] ")%(s.getpeername()[0]), print("queue is empty") outputs.remove(s) else: print("sending msg to [%s]"%(s.getpeername()[0]),next_msg) #输出客户端的信息 s.send(next_msg.upper()) for s in exceptionl: #处理出现异常的连接 print("handling exception for",s.getpeername()) inputs.remove(s) if s in outputs: outputs.remove(s) s.close() del message_queue[s]
0 0
- Python:简单select模块使用
- python里使用select模块
- Python中的select模块如何使用?
- python nose模块简单使用
- Python os模块 简单使用
- python --select模块
- Python的Select模块
- [Python学习] Logging模块的简单使用
- python多线程模块threadpool简单使用
- [Python学习]Logging模块的简单使用
- Python的Socket模块简单使用
- Python的Socket模块简单使用医
- [Python监控]psutil模块简单使用
- python logging模块的简单使用
- python argparse模块的简单使用
- Python Logging模块的简单使用
- python模块heapq之简单学习使用
- Python中argparse模块简单使用
- 2D的RPG游戏人物角色移动代码(以egret游戏引擎、TypeScript语言为例)
- HDU4800——Josephina and RPG(概率dp)
- 欢迎使用CSDN-markdown编辑器
- iwebshop功能添加--积分抽奖(生成代金券)
- 第三天
- Python:简单select模块使用
- cuda示例截图
- 【信息论】信源与信源熵(一)
- 正则表达式的基本用法
- AutoIt操作Dynamic control Id控件
- 如何不输入项目名端口号直接访问java web项目
- cocos2dx touch 单击、双击、三连击和长按事件处理
- java中 基本数据结构的应用
- 同步传输 异步传输