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()#链接完要断开

       

    • 服务端解决粘包问题等
      •   
         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'))
        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 Code

         

    • 客户端解决问题
      •   
         1 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()#链接完要断开
        View Code

         


 

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()#创建字典形式
  • 进程池
    •   
       1 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()
      View Code


      pool()#进程池

    • p.apply#每个人物是排队进行
    • p.apply_async#每个任务都是并发进行的,可以设置回调函数callback=xx

     

redis

  •   incr#计数器,加一
  •        decr#计数器,减一
  • get获取

    

posted @ 2017-06-14 10:56  自习室  阅读(52)  评论(0)    收藏  举报