day 36 网络编程终结内容
今日概要:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 gevent模块 协程:单线程下实现并发(并发指的是看起来同时运行,实现方式:切换+保存状态) 遇到IO切换到其他任务去执行,这种切换才能提高效率 gevent模块 1、切换+保存状态 2、检测单线程下任务的IO,实现遇到IO自动切换 2 IO模型 3 socketserver 4 subprocess 5 paramiko (了解)
这个博客地址里有今天的所有内容,
http://www.cnblogs.com/linhaifeng/articles/7454717.html
昨天作业-----协程:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
这里是服务端: from gevent import spawn,monkey;monkey.patch_all() from socket import * def server(ip,port): server = socket(AF_INET, SOCK_STREAM) server.bind((ip,port)) server.listen(5) while True: conn, addr = server.accept() print(addr) # .... # t=Thread(target=talk,args=(conn,add)) # t.start() spawn(talk,conn,addr) def talk(conn,addr): while True: try: data=conn.recv(1024) if not data:break conn.send(data.upper()) except ConnectionResetError: break conn.close() if __name__ == '__main__': server('127.0.0.1',8080) 客户端: from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect(('127.0.0.1',8080)) while True: client.send('hello'.encode('utf-8')) data=client.recv(1024) print(data.decode('utf-8'))
io模型:
io模型就是单纯的遇到阻塞就等待,原地待命,直至阻塞结束才会继续执行任务,这个等待的过程中占用cpu,占用的同时还不让其他的程序去使用CPU执行其他任务,就大大的降低了效率.
服务端:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from socket import * server = socket(AF_INET, SOCK_STREAM) server.bind(('127.0.0.1',8081)) server.listen(5) while True: conn, addr = server.accept() print(addr) while True: try: data=conn.recv(1024) if not data:break conn.send(data.upper()) except ConnectionResetError: break conn.close() server.close()
客户端:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect(('127.0.0.1',8080)) while True: client.send('hello'.encode('utf-8')) data=client.recv(1024) print(data.decode('utf-8'))
非io模型:
服务端:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# from socket import * # import time # server = socket(AF_INET, SOCK_STREAM) # server.bind(('127.0.0.1',8084)) # server.listen(3) # server.setblocking(False) # 这里是在把socket接口设置成非阻塞, # conn_l = [] # 这是把所有的客户端都放到这个的空列表里面 # while True: # try: # conn, addr = server.accept() # conn_l.append(conn) # 把得到的每一个客户端都放进这里的列表里面 # print(addr) # except BlockingIOError: # 遇到这个异常的时候就打印下面的内容,以此来避开异常 # print('do something else', conn_l) # del_l = [] # 这里是又另外建一个空列表,这里的空列表我们要在里面存放一些冗余的数据以及客户端, # # 那么问题来了,什么情况下是归属到冗余的客户端以及数据呢,我们的服务端跟多个客户端连接的时候, # # 客户端会出现很多的特殊情况,比如断电断网或者心情不好就直接断开连接,那么这个时候是会影响到其他的客户端的, # # 我们就把他们拿出来放到这个列表里面,然后再遍历这个列表里面的内容,最终目的是要把那些死掉的客户端从最初始的列表里面删除, # # 这样每次循环的时候就不需要再循环他们了.因为他们已经死掉了,如果不删除他们的话,会报错. # for conn in conn_l: # 遍历这里存放客户端的列表 # try: # data = conn.recv(1024) # if not data: # conn.close() # del_l.append(conn) # continue # conn.send(data.upper()) # except BlockingIOError: # pass # except ConnectionResetError: # conn.close() # del_l.append(conn) # # for conn in del_l: # conn_l.remove(conn)
客户端:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect(('127.0.0.1',8084)) while True: msg=input('>>: ').strip() if not msg:continue client.send(msg.encode('utf-8')) data=client.recv(1024) print(data.decode('utf-8'))