zoukankan      html  css  js  c++  java
  • python之day10(socketserver)

    Day10

    上节回顾:      

     socket
                1 导入模块
                2 创建socket
                3
                    字节
                    send    sendall
                    10字节 = send("alex123123deqasdsa")
                    sendall:        #会源源不断的发送完
                        while True:
                            10字节 = send("alex123123deqasdsa")
                            10字节 = send("alex123123deqasdsa")
                            10字节 = send("alex123123deqasdsa")
                    recv(2048)        #最多接收2048字节
            粘包:ack
            socketserver
                
                1 自定义类
                2 继承类
                3 handle方法
                4 socketserver == 调用自定义类
                5 运行 forever

    上节作业


        1 socket 发送字符串
        2 socket发送文件
            客户端:
                文件大小
                发消息
                
            服务器端:
                接收消息(根据文件大小)
                
            客户端:
                json ->用户 密码
                字符串
            服务端:
                用户验证
                接受,subprocess > win > gbk编码的字节
                上传文件(大小)
                发消息

    作业问题:
        断点续传
            文件:
                a 追加
                w 清空写
            文件指针:
                seek(num)

    小知识点:


        作用域:
        python中无块级作用域
            java/c#        不可
            python/javascript    可以
            if 1==1:
                name = "alex"
            print(name)

    if 1 == 1 :
        name = "alex"
    print(name)
    
    def func():
        name1 = "alex"
    func()
    print(name1)
    
    name = "alex"
    
    def f1():
        print(name)
    
    def f2():
        name = "eric"
        return f1
    
    ret = f2()
    ret()
    


        python以函数作为一个作用域


        python 作用域链,由内向外找。,直到找不到报错。
        对于作用域来说,在函数为执行之前,作用域和作用域链都已经确定了
        li = [lambda :x for x in range(10)]
        print(li)
        #函数在没有执行前 ,内部代码不执行。
        li = [lambda :x for x in range(10)]
        print(li)
        print(li[0]())    
        #函数在没有执行前 ,内部代码不执行。
        9

    li = [x for x in range(10)]
    print(li)
    
    
    li = [lambda :x for x in range(10)]
    print(li)
    print(li[0]())
    # #函数在没有执行前 ,内部代码不执行。
    
    li = []
    
    for i in range(10):
        def f1():
            return i
        li.append(f1)
    
    li[0]()
    

    py27多继承 py35多继承


    py35都继承object 27中的新式类


    socketserver源码***
        ****支持并发处理socket****


        

    IO多路复用:


        概述:
            select,poll,epoll
        select 个数限制 1024
        poll 无个数限制 不能跨平台
        epoll 谁变化了 主动告诉epoll
        监听socket对象内部是否变化了?
        什么时候变化?连接或收发消息
        服务器端的socket对象发生变化?就有新链接来了
        sk:有新连接来了。。。
        conn:要收"发"消息了
        
        IO多路复用 == 监听socket对象内部是否变化了?
        win--select
        rlist,w,e = select.select([sk,],[],[],1)  1是超时时间 1s
        #rlist中socket对象列表
        #sk有变化 rlist=[sk,]
        #sk无变化 rlist= []
        
        for r in rlist:
            conn, address = r.accept()
            conn,sendall(byte("hello"))
            
        实现读写分离

     1 #!/usr/bin/env  python
     2 # -*- coding: UTF-8 -*-
     3 # Author: Aaron Shen
     4 
     5 import socket
     6 import select
     7 
     8 sk = socket.socket()
     9 sk.bind(("127.0.0.1", 9999))
    10 sk.listen(5)
    11 
    12 inputs = [sk, ]
    13 outputs = []
    14 message = {}
    15 
    16 while True:
    17     rlist, wlist, e, = select.select(inputs, outputs, [], 1)
    18     print(len(inputs), len(rlist), len(wlist), len(outputs))
    19 
    20     for r in rlist:
    21         if r == sk:
    22 
    23             print(r)
    24             conn,addr = r.accept()
    25             inputs.append(conn)
    26             message[conn] = []
    27             conn.sendall(bytes("hello",encoding="utf-8"))
    28 
    29         else:
    30             # r.recv(1024)
    31             print("==========")
    32             try:
    33                 ret = r.recv(1024)
    34                 if not ret:
    35                     raise Exception ("断开连接")
    36                 else:
    37                     outputs.append(r)
    38                     message[r].append(ret)
    39             except Exception as e:
    40                 inputs.remove(r)
    41                 del message[r]
    42 
    43     for w in wlist:
    44         msg = message[w].pop()
    45         rspe = msg + bytes("response", encoding="utf-8")
    46         w.sendall(rspe)
    47         outputs.remove(w)
    test_erver
     1 #!/usr/bin/env  python
     2 # -*- coding: UTF-8 -*-
     3 # Author: Aaron Shen
     4 
     5 import socket
     6 sk = socket.socket()
     7 sk.connect(("127.0.0.1",9999))
     8 
     9 date = sk.recv(1024)
    10 print(date)
    11 
    12 while True:
    13     inp = input(">>>")
    14     sk.sendall(bytes(inp,encoding="utf-8"))
    15     print(sk.recv(1024))
    16 
    17 sk.close()
    test_client

    多线程,多进程,协程    

      概述:
            
        Alex甄嬛西游传
        
        1  一个应用程序,可以有多进程和多线程,默认是单进程,单线程
        2 默认:单进程,单线程。
        3 单进程,多线程
        
            多线程: IO操作 -- 不占用cpu  可以提高并发
                            多线程提高并发
                    计算性操作,需要占用cpu ,无法提高并发
                            多进程提高并发
        4 GIL 全局解释器锁
        ====
            多线程,多进程 提供并发
            IO密集型:多线程
            计算密集型 多进程提高并发    
                PS IO操作 不占用cpu  GIL 全局解释器
                
    如何创建线程
    def f1(arg):
        print(arg)
        
    #for i in range(10):

    import threading

    t = threading.Thread(target=f1, args=(123, ))  #子线程
    t.setDaemon(True)  #true 表示主线程不等此子线程 默认是False
    t.start()    #不代表当前线程会被立即执行。
    t.join(2)    #主线程停止,等待子线程执行完在执行
                #参数2 表示主线程最多等待2秒
    f1(111)
    print("end")

    def f1(arg):
    	print(arg)
    
    #for i in range(10):
    
    import threading
    
    t = threading.Thread(target=f1, args=(123, ))  #子线程
    t.setDaemon(True)  #true 表示主线程不等此子线程
    t.start()	#不代表当前线程会被立即执行。
    t.join(2)	#主线程停止,等待子线程执行完在执行
    			#参数2 表示主线程最多等待2秒
    f1(111)
    print("end")
    
  • 相关阅读:
    基本MVVM 和 ICommand用法举例(转)
    WPF C# 命令的运行机制
    628. Maximum Product of Three Numbers
    605. Can Place Flowers
    581. Shortest Unsorted Continuous Subarray
    152. Maximum Product Subarray
    216. Combination Sum III
    448. Find All Numbers Disappeared in an Array
    268. Missing Number
    414. Third Maximum Number
  • 原文地址:https://www.cnblogs.com/aaron-shen/p/5659891.html
Copyright © 2011-2022 走看看