day 36 网络编程终结内容

今日概要:

1 gevent模块
    协程:单线程下实现并发(并发指的是看起来同时运行,实现方式:切换+保存状态)
    遇到IO切换到其他任务去执行,这种切换才能提高效率

    gevent模块
    1、切换+保存状态
    2、检测单线程下任务的IO,实现遇到IO自动切换

2 IO模型
3 socketserver

4 subprocess

5 paramiko (了解)
View Code

这个博客地址里有今天的所有内容,

http://www.cnblogs.com/linhaifeng/articles/7454717.html

昨天作业-----协程:

这里是服务端:

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'))
View Code

io模型:

io模型就是单纯的遇到阻塞就等待,原地待命,直至阻塞结束才会继续执行任务,这个等待的过程中占用cpu,占用的同时还不让其他的程序去使用CPU执行其他任务,就大大的降低了效率.

服务端:

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()
View Code

客户端:

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'))
View Code

非io模型:

服务端:

# 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)
View Code

客户端:

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'))
View Code
原文地址:https://www.cnblogs.com/2012-dream/p/7995318.html