关于Socket中的Select使用理解

以下是代码和中文注释的个人理解

import socket, select, Queueserver=('192.168.2.100',10086)#创建TCP/TP Socket
sock_ser=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#设置不阻塞监听
sock_ser.setblocking(False)
sock_ser.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#绑定IP地址
sock_ser.bind(server)
#监听连接
sock_ser.listen(10)#准备用来读取数据的Socket,客户端向服务端的读端口写
incomes=[sock_ser]
#准备用来写的Socket,客户端从写Socket读
outputs=[]"""
写出消息的队列,由于select是循环机制,所以每个独立的outputs都需要一个队列来保存待写出的数据,
等到轮回到自己的时候写出
"""
msg_que={}#超时时间。
timeout=20#服务端的Socket用来接受服务端的连接,并用作与循环。
while incomes:"""先等待至少一个Socket的数据处理,Select返回当前三个列表。这三个数据来自于可读,可写,返回的错误。Select监听并等待网络活动。如果有网络活动则开始执行"""rs,ws,es=select.select(incomes,outputs,incomes,timeout)if not(rs or ws or es):print "error: timeout...."breakfor s in rs:"""此处的rs存储很多Socket,开始存储只有服务端本身的Socket,用于与客户端建立新的连接。并将客户端建立好的连接存储在incomes中,incomes会返回给rs。存储的的客户端,会被用于收发数据。"""#rs队列中按个读取,如果是服务端的socket就用那个与建立新的连接。if s is sock_ser:conn,addr=s.accept()print "connect by  ",addrconn.setblocking(False)incomes.append(conn)#为接入的客户端提供一个队列来发送回复给客户端的数据msg_que[conn]=Queue.Queue()#如果不是服务端的socket,是客户端建立连接的Socket,就收数据,并判断是否断开。else:data=s.recv(1024)#有数据就收数据if data:print "receive client ",datamsg_que[s].put(data)if s not in outputs:outputs.append(s)#可读的socket没有数据发送,则说明客户端断开连接,我们删除这个客户端。else:if s in outputs:outputs.remove(s)incomes.remove(s)s.close()del msg_que[s]#写操作,查看队列里面是否有东西,并发送到对应的Socket.for s in ws:try:msg = msg_que[s].get_nowait()except Queue.Empty:#因为是轮回的,当前面连接断开后,写的socket尚未删除,这一步还是要执行的,所以最后输出了几个EMPTY。print 'msg empty'outputs.remove(s)else:s.send("from server :"+msg)for s in es:print "except",s.getpeername()if s in incomes:incomes.remove(s)if s in outputs:outputs.remove(s)s.close()del msg_que[s]

  

转载于:https://www.cnblogs.com/freeideas/archive/2013/04/29/3050255.html

PYTHON__关于Socket中的Select使用理解相关推荐

  1. linux select函数返回值,socket中的select函数使用

    socket select()函数用于定时检查以创建的socket句柄的状态,以确定设定的socket句柄当前是否可写或有数据可读. select函数提供了一种方法,使得程序在操作socket时(如r ...

  2. 深入理解python中的select模块

    简介 Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue ...

  3. python select模块_深入理解python中的select模块

    简介 Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kque ...

  4. 传输层中UDP的深入理解以及socket中UDP的使用

    目录 一.学习UDP的预备知识 1.熟悉网络通信中的五元组 (1)源IP地址和目的IP地址 (2)源端口号和目的端口号 (3)协议号 2.什么是客户端和服务端 二.socketAPI中UDP的使用 1 ...

  5. 对网络中安全审计产品的理解

    对网络中安全审计产品的理解<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...

  6. socket编程 及select poll epoll示例

    [cpp] view plain copy 1.关于字节排序    网际协议采用大端字节序,来传输多字节整数.    系统提供了转换的宏定义,如果主机与网际协议相同,则宏定义为空. 2.客户端    ...

  7. 多路复用IO模型中的select和epoll

    多路复用IO模型中的select和epoll 一,前提知识--文件描述符fd 1.文件描述符简介 首先从文件描述符开始讲起.因为,对于内核而言,所有打开的文件都是通过文件描述符引用的.那么文件描述符到 ...

  8. Python中的select、epoll详解

    Python中的select.epoll详解 文章目录 Python中的select.epoll详解 一.select 1.相关概念 2.select的特性 1.那么单进程是如何实现多并发的呢??? ...

  9. mysql存储过程into_MySQL存储过程中使用SELECT …INTO语句为变量赋值

    使用SELECT -INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT -INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量.SELECT -INTO语句 ...

最新文章

  1. 纠错工具之 - Proovread
  2. vc++ 显式链接dll
  3. angular 路由页面不刷新
  4. Psych101(part2)--Day2
  5. java私塾跟我学系列_java 私塾作业
  6. 性能测试中问题反思和心得
  7. 当鼠标移动到上面时的应用
  8. Java语言与开发环境
  9. P1757 通天之分组背包 (分组背包 模板
  10. BI项目实施为什么成功率那么低
  11. python3 全局变量_Python3基础 当函数中的局部变量与全局变量同名了,各管各的...
  12. Arm居然为Cortex-M发布了专属显卡驱动!
  13. 为什么要分库分表?一个业务场景来理顺它!
  14. Linux 文件名和路径的最大长度
  15. 听云短信接口安全测试,你的短信接口到底有多危险,可能瞬间损失过万,短信接口防盗刷测试
  16. selenium +eclipse+firefox/chrome 环境全套搭配
  17. 排查解决 - Linux无法访问百度(公网)?
  18. 后真相时代(post-truth)出现的原因及影响
  19. 中国科学院大学计算机分数线低,2018中国科学院大学录取分数线公布,能否冲击清北霸主地位?...
  20. 关于NODE_ENV的说明

热门文章

  1. 通过 Service 访问 Pod - 每天5分钟玩转 Docker 容器技术(136)
  2. 哪些信用卡取现0手续费?
  3. 我们需要什么样的恐怖小说?
  4. stepinto stepout stepover的区别
  5. mysql 层_mysql三层体系
  6. mysql远程压力测试_mysql压力测试脚本实例
  7. tensorflow官方posenet模型解析
  8. HMM——前向后向算法
  9. Sublime优美设置(待续)
  10. 国外少儿PYTHON编程书推荐