使用select模块实现IO多路复用服务端

 import socket
import select
#windows上只支持select.select,不支持poll epoll HOST = "127.0.0.1"
PORT = 9999
BUFFSIZE = 1024
ADDR = (HOST, PORT)
#创建服务器端监听套接字
tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpSocket.bind(ADDR)
tcpSocket.listen(5)
tcpSocket.setblocking(0) #监听读事件
inputs = [tcpSocket]
#监听写事件
outputs = []
#监听异常事件
exceptions = [] messageDict = {} while True:
#每当有客户端连接时,返回的r_list中包含监听的服务器套接字tcpSocket
#w_list中始终与outputs相同
r_list, w_list, e_list = select.select(inputs, outputs, exceptions, 1)
print(len(inputs))
for r in r_list:
if r == tcpSocket:
request, addr = r.accept()
request.setblocking(0)
#将客户端套接字加入到监听列表中,接下来每当客户端发送数据过来,r_list中即可包含该套接字
inputs.append(request)
messageDict[request] = []
#如果套接字不等于tcpSocket,说明是客户端发送数据
else:
try:
dataBytes = r.recv(1024)
#说明客户端断开连接
#ConnectionResetError
except Exception as e:
#将客户端套接字移除出监听列表
inputs.remove(r)
del messageDict[r]
r.close()
else:
dataStr = str(dataBytes, encoding="utf-8")
messageDict[r].append(dataStr)
# print("接收到来自", r.getpeername(), " : ", dataStr)
# r.sendall(bytes("已经收到您发送的" + dataStr, encoding="utf-8"))
#添加到outputs,下次再循环时w_list中包含数据
outputs.append(r) for w in w_list:
messageList = messageDict[w]
recvData = messageList[0]
del messageList[0]
print("接收到来自", w.getpeername(), " : ", recvData)
w.sendall(bytes("已经收到您发送的" + recvData, encoding="utf-8"))
outputs.remove(w)
tcpSocket.close()

最新文章

  1. ubuntu安装simplejson模块
  2. C和指针 第十六章 标准函数库 信号
  3. Linux新建用户并添加到sudo组
  4. 精益VS六西格玛
  5. 使用STL库sort函数对vector进行排序
  6. SUSE Linux Enterprise Server 设置防火墙开启ssh远程端口
  7. LightOJ_1248 Dice (III)
  8. 关于自定义的 XIB cell上的 button如何在控制器里实现点击方法
  9. anaconda 下多版本Python 安装说明
  10. 怎么用Sublime查找替换整个文件夹下的所有文件内容?
  11. transform:rotate3d/tranlate3d
  12. nginx-高并发配置 第七章
  13. ajax请求本地文件
  14. Python不可变对象
  15. GsonFormat的使用 (转)
  16. CF1027C Minimum Value Rectangle
  17. python练习笔记——组合恒等式
  18. ats编译中增加透明度 选项
  19. NuGet 让程序集版本变得混乱
  20. IP地址转换为Int

热门文章

  1. Nginx 缓存代理
  2. 在dva框架和create-react-app创建出来的框架中修饰器语法与按需加载引入antd分别配置
  3. 【Linux】gnuplot命令大全
  4. (转)理解inode
  5. 基于PyTorch的Seq2Seq翻译模型详细注释介绍(一)
  6. java代码简单实现队列
  7. C#判断文件是否被混淆
  8. @NOIP2018 - D1T1@ 铺设道路
  9. 支付宝防并发方案之"一锁二判三更新"
  10. @bzoj - 4382@ [POI2015] Podział naszyjnika