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")
时间: 2025-01-17 20:10:28

python之day10(socketserver)的相关文章

Python 元组day10

Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 = ('physics', 'chemistry', 1997, 2000);tup2 = (1, 2, 3, 4, 5 );tup3 = "a", "b", "c", "d"; 创建空元组 tup1 = (); 元组中只包含一个元素时,需要在元素

Python小白-day10 memcache&redis

Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Python操作Memcached 1.第一次操作 import memcache   mc = memcache.Clie

Python之路 - Socketserver实现多并发

Python之路 - Socketserver实现多并发 阅读指引 ?? socketserver ?? 实现多并发 ?? 阅读指引 ?? 在上面的整理篇章中 , 简单的网络编程基本已经会了 , 一个TCP , 一个UDP , 然后就是粘包问题 但是在上述中有一个问题 , 在现实生活中 , 一个服务端肯定常常需要同时服务好几个客户端 , 而上述篇章中并没有实现一对多同时进行的情况 , TCP中只能等前一个链接断开后续的才能连上 , 没连上就一直等 ; UDP则是接一次发一次 , 并不能同时接两次

python小白-day8 socketserver模块

SocketServer模块 SocketServer内部使用 IO多路复用 以及 "多线程" 和 "多进程" ,从而实现并发处理多个客户端请求的Socket服务端.即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个"线程"或者"进程" 专门负责处理当前客户端的所有请求. ThreadingTCPServer ThreadingTCPServer实现的Soket服务器内部会为每个client创建一个 &

python模块介绍- SocketServer 网络服务框架

来源:https://my.oschina.net/u/1433482/blog/190612 摘要: SocketServer简化了网络服务器的编写.它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer.这4个类是同步进行处理的,另外通过ForkingMixIn和ThreadingMixIn类来支持异步. 创建服务器的步骤.首先,你必须创建一个请求处理类,它是BaseRequestHandler的子类并重载其handle()

python socket和socketserver

Python提供了两个基本的socket模块.一个是socket,它提供了标准的BSD Socket API:另一个是socketServer,它提供了服务器中心类,可以简化网络服务器的开发. 下面先简要介绍socket模块包含的类及其使用. 1.开始了解socket模块前,先熟悉下Python的网络编程模块主要支持的两种Intent协议:TCP和UDP.TCP协议是一种面向连接的可靠协议,用于建立机器之间的双向通信流.UDP协议是一种较低级别的.以数据包为基础的协议(无连接传输模式).与TCP

Python 学习笔记 - socketserver源代码剖析

前面学习的例子都是单线程的socket收发:如果有多个用户同时接入,那么除了第一个连入的,后面的都会处于挂起等待的状态,直到当前连接的客户端断开为止. 通过使用socketserver,我们可以实现并发的连接. socketserver的使用很简单: 首先看个简单的例子 服务端: 自己定义一个类,继承socketserver.baserequesthandler; 然后定义一个方法 handle() 然后通过socketserver.threadingTCPServer指定套接字和自己定义的类,

python学习day10

目录 Twisted Redis RabbitMQ   Twisted   事件驱动 事件驱动分为两个部分:第一,注册事件:第二,触发事件. 自定义事件启动框架,命名为:"弑君者": #!/usr/bin/env python # -*- coding:utf-8 -*- # event_drive.py event_list = [] def run(): for event in event_list: obj = event() obj.execute() class BaseH

Python 模块(八) socketserver 以及 线程、进程

目录 异常处理 socketserver 线程.进程 一.异常处理 try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常. 代码示例: while True: n1 = input('input a number: ') n2 = input('input a number: ') try: n1 = int(n1) n2 = int(n2) res = n1 + n2 p