关于本站
人大经济论坛-经管之家:分享大学、考研、论文、会计、留学、数据、经济学、金融学、管理学、统计学、博弈论、统计年鉴、行业分析包括等相关资源。
经管之家是国内活跃的在线教育咨询平台!
获取电子版《CDA一级教材》
完整电子版已上线CDA网校,累计已有10万+在读~ 教材严格按考试大纲编写,适合CDA考生备考,也适合业务及数据分析岗位的从业者提升自我。
TOP热门关键词
看论坛上好多同学对第7周网络编程不甚理解,因此有必要把我的理解贴出来和大家分享一下,希望能帮助大家更好地理解。帖子中有什么不足之处欢迎大家指正。python网络编程难的地方不在网络,而在事件反馈机制。关键要理 ...
坛友互助群![]() |
扫码加入各岗位、行业、专业交流群![]() |
帖子中有什么不足之处欢迎大家指正。
python网络编程难的地方不在网络,而在事件反馈机制。
关键要理解什么时候产生事件,以及事件反馈回来结果参数及其含义。
整个过程其实就是注册事件-》产生事件-》返回事件-》处理事件 的整个流程,下面我用老师课上的select例子来描述(通过注释描述)这个过程。
import socket
import select
import Queue
#服务端监听地址和端口
server=('127.0.0.1',2013)
#创建socket
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#设置socket选项和监听过程
sock.setblocking(False)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sock.bind(server)
sock.listen(10)
#读事件的socket列表,这个很重要,不在这个列表中的socket得不到事件反馈通知,初始只有服务监听socket
rlists=[sock]
#写事件的socket列表
wlists=[]
#接收到的数据队列
msg_que={}
#等待超时20秒
timeout=20
#从后面逻辑看,while rlists相当于while True
while rlists:
"""
select过程就是等待网络事件的过程,分别是读、写和异常事件,这集中了注册事件、产生事件和返回事件的过程
注册事件: 是关注rlists(读),wlists(写),rlists(异常)中的socket列表
产生事件: 当客户端socket连接和发送、服务端向客户端socket写入、以及网络异常这些事件就会分别产生读、写和异常事件
返回事件: 当服务端接收到这些事件就返回相应的列表,分别对应rs,ws,es
如果在timeout时间内没有产生上述事件,也会返回,此时rs,ws,es均为空
"""
rs,ws,es = select.select(rlists,wlists,rlists,timeout)
#这说明没有socket事件
if not(rs or ws or es):
print "timeout......"
continue
#读事件,可能有多个socket产生读事件,s是读事件发生的socket
for s in rs:
#这个很重要,s是服务监听socket,所以是连接请求事件
if s is sock:
#接受客户端socket连接,产生负责和客户端socket进行一对一通讯的socket(就是conn)
conn,addr=s.accept()
print 'connet by ', addr
conn.setblocking(False)
#这个非常重要,如果不把conn加入rlists,那么该socket上的读写事件将得不到通知
rlists.append(conn)
#初始化conn的数据队列,后面读到数据就放入到这个队列中
msg_que[conn]=Queue.Queue()
#这是socket读事件
else:
#读数据
data=s.recv(1024)
#接收到数据
if data:
print data
#将读到的数据放入s的数据队列
msg_que
#将s加入到wlists队列,如果没有这个,s上发生的写事件就得不到事件通知
if s not in wlists:
wlists.append(s)
#没有接收到数据,通常是客户端主动断开socket连接,此时要将s从wlists和rlists中移除,并关闭s,清除s的数据队列
else:
if s in wlists:
wlists.remove(s)
rlists.remove(s)
s.close()
del msg_que
#写事件,可能有多个socket产生写事件,s是写事件发生的socket
for s in ws:
try:
#获取数据队列中的读到的数据
msg=msg_que
except Queue.Empty:
#数据队列中没有数据
print "msg empty"
wlists.remove(s)
else:
#发送数据
s.send(msg)
#异常事件, s是发生异常的socket
for s in es:
print "except",s.getpeername()
#将s从rlists中移除
if s in rlists:
rlists.remove(s)
#将s从wlists中移除
if s in wlists:
wlists.remove(s)
s.close()
del msg_que
sock.close()
print 'server sock closed'
复制代码
poll、epoll流程都是类似的,理解了这个,其它的应该也不在话下
推荐一篇经典e文,我还没来得及看。
扫码或添加微信号:坛友素质互助


「经管之家」APP:经管人学习、答疑、交友,就上经管之家!
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
您可能感兴趣的文章
人气文章
1.凡人大经济论坛-经管之家转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。




