python高级
socket简单交互
- tcp线连接在发
- utp直接发
- sk.bind(('127.0.0.1',9999,))#绑定自己的ip和端口(IP和端口是元组,元组后面加逗号表示是元组)
- 服务端
-
1 import socket 2 3 sk = socket.socket() 4 sk.bind(('127.0.0.1', 9999,))#绑定自己的ip和端口(IP和端口是元组,元组后面加逗号表示是元组) 5 sk.listen(5)#可以监听了,5表示可以等待五个 6 7 while True:#循环表示可以一直接受 8 conn,address = sk.accept()#表示可以接受客户端的请求<阻塞就是等待>conn=一条线,address另一个IP和端口 9 #accept链接和客户端地址信息 10 conn.sendall(bytes("欢迎欢迎",encoding='utf-8'))#sendall表示要连过来的客户端发信息,不支持字符串所有需要转成字节 11 while True:#循环 12 ret_bytes = conn.recv(1024)#也可以接受 13 ret_str = str(ret_bytes,encoding='utf-8')#客户接受到后返回的值,(知道客户已经接受到了 14 if ret_str == 'q':#表示如果等于q则退出 15 break 16 17 conn.sendall(bytes(ret_str+"好", encoding='utf-8'))#再发给客户端个好 18 # print(address,conn)
-
- 客户端
-
1 import socket 2 3 obj = socket.socket()#客户端创建对象 4 obj.connect(('127.0.0.1', 9999,))#链接服务端地址 5 6 ret_bytes = obj.recv(1024)#要接受服务端发来的消息,1024最多接受1024字节,超过1024下次接受<也会阻塞 7 ret_str = str(ret_bytes,encoding='utf-8')#因为接受的是字节所有转成字符串才能看到 8 print(ret_str) 9 10 while True: 11 inp = input("请输入要发送的内容:")#输入内容 12 if inp == 'q':#如果输入的是q自己也退出(把q发给服务端 13 obj.sendall(bytes(inp ,encoding='utf-8'))#发给服务端要发的对象转成字节码 14 break 15 else: 16 obj.sendall(bytes(inp, encoding='utf-8')) 17 ret = str(obj.recv(1024),encoding='utf-8')#服务端接受到后加个好又发回来了,所有要接受一下 18 print(ret) 19 # obj.close()#链接完要断开
- 服务端解决粘包问题等
-
View Code1 import socket 2 3 sk = socket.socket() 4 sk.bind(('127.0.0.1', 9999,))#绑定自己的ip和端口(IP和端口是元组,元组后面加逗号表示是元组) 5 sk.listen(5)#可以监听了,5表示可以等待五个 6 7 while True:#循环表示可以一直接受 8 conn,address = sk.accept()#表示可以接受客户端的请求<阻塞就是等待>conn=一条线,address另一个IP和端口 9 #accept链接和客户端地址信息 10 conn.sendall(bytes("欢迎欢迎:---", encoding='utf-8')) 11 file_size = str(conn.recv(1024),encoding='utf-8')#文件大小要接受,conn.recv是接受<recv默认是字节so要转换字符串 12 print(file_size) 13 conn.sendall(bytes("烧到大小lesgo", encoding='utf-8')) 14 total_size = int(file_size)#文件总大小 15 has_recv = 0#默认接受了0 16 17 f = open('6666666new.jpg','wb')#保存文件,二进制写入 18 while True:#一直接受 19 if total_size == has_recv: 20 break 21 data = conn.recv(1024)#接受数据,每次最多1024字节 22 f.write(data)#接受到数据写进f里面 23 has_recv += len(data)#接受多少要加上has_recv 24 # f.closs()#写完后关闭
-
- 客户端解决问题
-
View Code1 import socket 2 import os 3 4 obj = socket.socket()#客户端创建对象 5 obj.connect(('127.0.0.1', 9999,))#链接服务端地址 6 7 ret_bytes = obj.recv(1024)#要接受服务端发来的消息,1024最多接受1024字节,超过1024下次接受<也会阻塞 8 ret_str = str(ret_bytes,encoding='utf-8')#因为接受的是字节所有转成字符串才能看到 9 print(ret_str) 10 11 size = os.stat('6a.jpg').st_size#文件大小 12 obj.sendall(bytes(str(size),encoding='utf-8'))#sendall发送文件大小字,6a字符串转成字节 13 14 obj.recv(1024)#发完大小服务端接受一下 15 16 with open('6a.jpg','rb') as f:#客户端打开图片,rb用二进制读 17 for line in f:#发送文件 18 obj.sendall(line)#sendall发送出去 19 20 21 22 obj.close()#链接完要断开
-
-
I/O多路复用
select可以监听多个端口,客户端一旦发生变化就能感知到
- I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作
- 简单说:可以监听多个文件描述符(就是socket对象(句柄)一旦文件句柄有变化就可以感知到
- 服务端
-
1 import socket 2 3 sk1 = socket.socket()#创建对象 4 sk1.bind(('127.0.0.1',8001))#绑定地址 5 sk1.listen()#监听 6 7 sk2 = socket.socket()#创建对象 8 sk2.bind(('127.0.0.1',8002))#绑定地址 9 sk2.listen()#监听 10 11 sk3 = socket.socket()#创建对象 12 sk3.bind(('127.0.0.1',8003))#绑定地址 13 sk3.listen()#监听 14 15 inputs = [sk1,sk2,sk3,] 16 import select 17 18 while True:#↓,inputs代表sk1 sk2]select在内部会自动监听列表里所有对象,一旦某个句柄发生变化 19 #变化也就是只要有谁连accept就发生变化 20 #如果有人链接sk1,r_list = [sk1]的列表 21 r_list,w_list,e_list = select.select(inputs,[],[],1)#1就是系统会等一秒,如果1秒后没人链接就会往下走 22 #e_list对应最后参数,谁发生错误了放入它里面,然后r_list不接受就了
#w_list对应中间括号列表,第二个中括号里面传什么值就会传给w_liet 23 for sk in r_list: 24 conn,address = sk.accept()#conn可能是每一个链接对象 25 conn.sendall(bytes('hello!!',encoding='utf-8'))#sendall是发送,为每个链接的对象发送hello 26 conn.close()#发完hello就关闭
-
- 客户端
-
1 import socket 2 3 obj = socket.socket()#客户端创建对象 4 obj.connect(('127.0.0.1', 8001,))#connect是连接,链接服务端地址 5 6 content = str(obj.recv(1024),encoding='utf-8') 7 print(content) 8 obj.close()
-
线程
- 创建线程
-
1 import threading,time 2 3 def f0(): 4 pass 5 def f1(a1,a2,a3,): 6 time.sleep(2) 7 f0()#嵌套f0,(调用 8 t = threading.Thread(target=f1,args=(11,22,33,))#target等于f1要调用,args函数传几个就要写几个传参数 9 t.setDaemon(True)#True/表示等不等 子线程结束 10 t.start()#运行子线程
t1.join(2)#主线程等子线程运行完了在往下走,传参数2最多等两秒,如果当前线程十秒那就两秒ok,如果一秒那就一秒
-
进程
- m = Manager()#数据共享
- dic = m.dict()#创建字典形式
- 进程池
-
View Code1 from multiprocessing import Pool 2 import time 3 4 5 def f1(a): 6 time.sleep(1.2) 7 print(a) 8 if __name__ == "__main__": 9 pool = Pool(8) 10 for i in range(520): 11 ret = pool.apply_async(func=f1,args=(i,)) 12 pool.close() 13 pool.join()
pool()#进程池 - p.apply#每个人物是排队进行
- p.apply_async#每个任务都是并发进行的,可以设置回调函数callback=xx
-
redis
- incr#计数器,加一
- decr#计数器,减一
- get获取


浙公网安备 33010602011771号