• 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
  • 相关阅读:
    HDU 4315 Climbing the Hill [阶梯Nim]
    POJ 1704 Georgia and Bob [阶梯Nim]
    BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏 [Nim游戏 SG函数]
    BZOJ 1299: [LLH邀请赛]巧克力棒 [组合游戏]
    浏览器缓存知识点总结
    软件测试自动化的最新趋势
    性能测试面试题(附答案
    最流行的自动化测试工具,总有一款适合你
    49种软件测试方法
    linux执行jmeter脚本解决响应数据为空
  • 原文地址:https://www.cnblogs.com/2012-dream/p/7995318.html
Copyright © 2020-2023  润新知