zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    nginx防止域名被恶意指向
    sphinx增量索引
    nginx根据IP限制访问
    centos 下使用locate命令
    centos安装启动telnet服务
    更换阿里云YUM源
    只有IE64位浏览器能上网,其他QQ、FF、CHROME都上不了网的问题
    php合并图片
    coreseek3.2.14全文搜索引擎安装使用
    jw player+nginx搭配流媒体播放器
  • 原文地址:https://www.cnblogs.com/2012-dream/p/7995318.html
Copyright © 2011-2022 走看看