今天学习了网络传输中的两个阶段、阻塞IO、非阻塞IO和多路复用

  一、网络传输中的两个阶段

  分别是 waitdata 和 copydata

  send就是copydata

  recv是waitdata和copydata

  二、阻塞  IO

  无论是线程 进程  还是线程 进程池  统统都是阻塞IO

  三、非阻塞IO

  最直接体现 所有和读写相关的函数 都不会阻塞

  意味着 在读写时  并不能确定目前是否可以读写 一旦不能读写就抛出异常

  只能使用 try except 来判断是否可以读写

  必须不断的执行系统调用  CPU占用特别高 当没有任何数据要处理的时候简直就是病毒

  

#非阻塞IO模型 客户端
import socket
c = socket.socket()
c.connect(('127.0.0.1',9999))
while True:msg = input('>>>:')if not msg:continuec.send(msg.encode('utf-8'))data = c.recv(1024)print(data.decode('utf-8'))

#非阻塞IO模型 服务器
import socket
server = socket.socket()
server.setsocket(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server.bind(('127.0.0.1',9999))
server.listen(5)
server.setblocking(False)
def data_handler(conn):print('一个新连接..')while True:data = conn.recv(1024)conn.send(data.upper())
clients = []
send_datas = []
del_datas = []
closed_cs = []
while True:try:conn,addr = server.accept()clients.append(conn)except BlockingIOError:for c in clients:try:data = c.recv(1024)if not data:c.close()closed_cs.append(c)continueprint('收到%s'%data.decode('utf-8'))send_datas.append((c,data))except BlockingIOError:passexcept ConnectionResetError:c.close()closed_cs.append(c)for data in send_datas:try:data[0].send(data[1].upper())del_datas.append(data)except BlockingIOError:continueexcept ConnectionResetError:data[0].close()closed_cs.append(data[0])del_datas.append(data)for d in del_datas:send_datas.remove(d)del_datas.clear()for c in closed_cs:clients.remove(c)closed_cs.clear()

  四、多路复用

    核心函数select

    帮你检测所有的连接 找出可以被处理(可以读写)的连接

    作为处理数据的一方 不再需要重复去向系统询问 select给你谁 你就处理谁 没给就不处理

#多路复用模型  客户端
import socket
c = socket.socket()
c.connect(('127.0.0.1',9999))
while True:msg = input('>>>:')if not msg:continuec.send(msg.encode('utf-8'))data = c.recv(1024)print(data.decode('utf-8'))

#多路复用模型  服务器
import socket
import select
#select帮你从一堆连接中找出来需要被处理的连接
server = socket.socket()
#重用端口
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server.bind(('127.0.0.1',9999))
server.listen(5)
#设置是否为阻塞  默认阻塞
server.setblocking(False)
#需要检测是  是否可读取的列表 (recv就是一个读取操作)
rlist = [server,]
#需要检测的   是否写入的列表    (send就是写入操作)
wlist = []
#需要发送的数据 目前是因为 我们要把接受的数据再发回去  所以搞了这个东西  正常没有这种需求
#目前客户端与服务器端 交互 是必须客户端发送数据 服务端才能返回数据 正常没有这种需求
dic = {}while True:    #用于检测需要处理的连接 需要不断检测 所以循环#rl目前可读的客户端列表  wl目前可写的客户端列表rl,wl,xl = select.select(rlist,wlist,[])    #select默认阻塞  阻塞到任意一个连接可以被处理print(len(rl))#处理可读的socketfor c in rl:#无论是客户端还是服务端只要可读就会执行到这里if c == server:#接受客户端的连接请求(一个读操作)conn,addr = c.accept()#将新连接也交给select来检测
            rlist.append(conn)else:    #不是服务器 就是客户端 客户端可读 可以执行recvtry:data = c.recv(1024)if not data:c.close()rlist.remove(c)print('%s 发送 %s'%(c,data.decode('utf-8')))#给客户端发送数据前要保证目前可以发送 将客户端加入检测列表wlist.append(c)    #正常开发中 不可能必须客户端发送数据过来后才能给客户端发送#可以这个添加到检测列表的操作 应该建立连接后立即执行#要发送的数据dic[c] = dataexcept ConnectionResetError:#客户端关闭连接
                c.close()rlist.remove(c)#处理可写的socketfor c in wl:print(c)try:c.send(dic[c].upper())#删除数据
            dic.pop(c)#从检测列表中删除已发送完成的客户端
            wlist.remove(c)except ConnectionResetError:c.close()    #关闭连接dic.pop(c)    #删除要发送的数据wlist.remove(c)    #从待检测的列表中删除except BlockingIOError:    #可能缓存满了 发不了pass

转载于:https://www.cnblogs.com/xiaocaiyang/p/9960492.html

网络传输中的两个阶段、阻塞IO、非阻塞IO和多路复用相关推荐

  1. Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)

    MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明 ...

  2. 网络编程中同步与异步,IO阻塞与非阻塞总结

    IO操作分两个阶段 第1个阶段:等待数据准备好(从外部设备磁盘或网络读到内核缓冲区): 第2个阶段:采用系统调用(内核进程),操作系统内核将数据从内核缓冲区读到用户空间. 第1阶段花费的时间远远大于第 ...

  3. 网络传输中的那些编码之-URL编码

    由于URL编码的一些混乱情况,曾经困扰着无数的程序员,本文将捋一捋URL编码相关的一些知识点,希望看望之后能给人恍然大悟的感觉. 本文将从如下几个方面进行介绍: 什么是URL编码 为什么进行URL编码 ...

  4. 数据丢包怎么修复_一种网络传输中实时音频数据丢包恢复的方法与流程

    本发明涉及通信技术领域,具体涉及一种网络传输中实时音频数据丢包恢复的方法. 背景技术: 随着通信技术的发展,音频传输系统对实时性和准确性的要求越来越高.在网络的音频传输过程中,影响音频音质的主要因素是 ...

  5. 网络传输中的那些编码之-base64编码

    在前面一篇文章中,这里介绍了URL编码的一些知识点,本文将对网络中另外一个常见的编码方式base64编码进行介绍. 同样的,按照之前的介绍方式,本文将从如下几个方面进行介绍: 什么是base64编码 ...

  6. 网络传输中的数据长度

    探究网络传输中不同层级的数据大小和数据格式 网络中不同层次的数据统称为PDU (协议数据单元 - protocol data unit) 每一层中可能有一种或多种协议,挑选最常见的协议进行说明 数据链 ...

  7. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  8. (转载)网络编程释疑之:同步,异步,阻塞,非阻塞

    一讲到网络编程的I/O模型,总会涉及到这几个概念.问了很多人,没几个能清晰地讲出他们之间的区别联系,甚至在网络上也有很多不同的观点,也不知是中国文字释义的博大精深,还是本来这几个概念就是绕人不倦.今天 ...

  9. 网络编程释疑之:同步,异步,阻塞,非阻塞

    一讲到网络编程的I/O模型,总会涉及到这几个概念.问了很多人,没几个能清晰地讲出他们之间的区别联系,甚至在网络上也有很多不同的观点,也不知是中国文字释义的博大精深,还是本来这几个概念就是绕人不倦.今天 ...

最新文章

  1. Hadoop-虚拟机环境准备
  2. 演示:GLBP跟踪功能、权值、与不同的负载均衡方式
  3. HNCU1101:马的移动---BFS
  4. SerialPort comstat is being used without defining
  5. 读人人都是产品经理__1
  6. 10.9 自动注册DSN和创建表
  7. cron表达式在线测试
  8. mysql+installer+community+5.7.9_win10系统,mysql-installer-community-5.7.19.0.msi安装
  9. DELL R340 14G服务器的RAID划分
  10. Python数据结构与算法(1.4)——Python基础之控制结构
  11. 环境工程微生物学练习题
  12. Python 微信自动化工具开发系列01_自动获取微信聊天信息(2023年1月可用)
  13. 我的发明20220723
  14. 对IPv6的理解以及其与IPv4的区别
  15. 每日一句_《南柯子·池水凝新碧》
  16. 一名合格的拼多多运营需要具备哪些技能?
  17. oracle修改用户system密码忘记,Oracle System密码忘记 密码修改、删除账号锁定lock (转) - mano...
  18. Introduction to Fabric.js. Part 3(介绍Fabric.js第三部分)
  19. 线性函数,C语言方式实现
  20. hp服务器 优盘安装系统安装win7系统安装win7系统安装,hp如何安装系统win7

热门文章

  1. java 取绝对值_Java实现一致性哈希算法,并搭建环境测试其负载均衡特性
  2. rmi远程代码执行漏洞_【漏洞通告】Apache Solr远程代码执行漏洞
  3. python的plt函数_plt.plot画图函数
  4. linux下运行yolo,deepin(linux)编译安装yolo v4测试效果
  5. oracle的sequence是什么,关于Oracle的序列(Sequence)使用内容是什么呢?
  6. 解决Latex图片或者表格浮动
  7. 【深度学习入门到精通系列】Recurrent和Residual解释
  8. python【蓝桥杯vip练习题库】ADV-304矩阵转置
  9. 网络推广软件浅谈关键词如何布置才能让优化更事半功倍!
  10. 浅析商城网站建设需要注意哪些细节内容呢?