作业

  1. #__author : 'liuyang'
  2. #date : 2019/4/11 0011 下午 12:36
  3. # 这两天 1.软件开发规范 不写 没法做新作业
  4. #2. 认证+上传 +下载 + 校验文件的一致性
  5. # 3. socketserver 实现一个并发的上传
  6. # 4. 选做: #进度条
  7. # 5.默写 并发的socketserver
  8. # 内置函数 print
  9. import time
  10. for i in range(0,101,2):
  11. time.sleep(0.1)
  12. char_num = i//2 #打印多少个'*'
  13. per_str = '\r%s%% : %s\n' % (i, '*' * char_num) if i == 100 else '\r%s%% : %s'%(i,'*'*char_num)
  14. print(per_str,end='', flush=True)
  15. #小越越 : \r 可以把光标移动到行首但不换行
  16.  
  17. # 打印进度条

sock的其它方法

  1. #__author : 'liuyang'
  2. #date : 2019/4/11 0011 下午 12:20
  3. # 没来得及 关闭 报错导致 conn.close() 和 sk.close()
  4. #端口没被占用 其实已经被占用了
  5. # sk.bind(()) # 申请了一个资源 向操作系统
  6. '''
  7. import socket
  8. sk = socket.socket()
  9. sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSERADDR,1)
  10. #防止程序因为意外退出之后程序出现端口 被占用的错
  11. #生产环境上不大用 不允许报错 不能另人占你端口
  12.  
  13. sk.bind(('127.0.0.1',9001))
  14. sk.listen()
  15. # 其他代码
  16. sk.close()
  17. '''
  18. import socket
  19. sk = socket.socket()
  20. sk.bind(('127.0.0.1',9001))
  21. sk.setblocking(False) #blocking 阻塞 设置 不设置默认阻塞
  22. # 非阻塞 #输入什么的没法非阻塞
  23. sk.listen()
  24.  
  25. conn_l = []
  26. while True:
  27. try :
  28. conn,addr = sk.accept()
  29. # conn.recv() #也不阻塞了 网络框架都用非阻塞 阻塞效率太低
  30. conn_l.append(conn)
  31. except BlockingIOError:
  32. for conn in conn_l:
  33. try:
  34. msg = conn.recv(1024).decode('utf-8')
  35. print(msg)
  36. conn.send(msg.upper().encode('utf-8'))
  37. except BlockingIOError:
  38. pass
  39. # sk.accept()
  40. # 不阻塞 conn1 不说话 去问 conn2 tcp的1对多

server

  1. import socket
  2.  
  3. sk = socket.socket()
  4. sk.connect(('127.0.0.1',9001))
  5.  
  6. while True:
  7. sk.send(b'hello')
  8. ret = sk.recv(1024)
  9. print(ret)

client 1 and 2

实现了tcp的一对多  不阻塞 input 不行

  1. import os
  2. import socket
  3. import hmac
  4. secret_key= b'liuyang'
  5. ret = os.urandom(32) #给每一个客户端发送一个随机的字符串,来保证即使数据被拦截你也不能使用这个信息
  6. sk = socket.socket()
  7. sk.bind(('127.0.0.1',9000))
  8. sk.listen()
  9. conn,addr = sk.accept()
  10. conn.send(ret)
  11.  
  12. hmac = hmac.new(secret_key,os.urandom(32))
  13. print(hmac.digest())
  14. ret = conn.recv(1024)
  15.  
  16. if ret == hmac.digest():
  17. print('是')
  18. else:
  19. print('不适')

错误的hmac server

  1. #__author : 'liuyang'
  2. #date : 2019/4/11 0011 下午 12:07
  3. #__author : 'liuyang'
  4. #date : 2019/4/11 0011 下午 12:02
  5. import socket
  6. import hmac
  7. import os
  8. sercet_key = b'liuyang'
  9. sk = socket.socket()
  10. sk.connect(('127.0.0.1',9000))
  11.  
  12. rand = sk.recv(32)
  13. hmac = hmac.new(sercet_key,os.urandom(32))
  14. print(hmac.digest())
  15. # sk.send(res1.encode('utf-8'))
  16. sk.send(hmac.digest())
  17. # hmac.digest()
  18. sk.close()

client

正确

  1. import os
  2. import hashlib
  3. import socket
  4.  
  5. secret_key = b'alex sb'
  6. #os.urandom(32) 给每一客户端发送一个随机的字符串,来保证即使数据被拦截你也不能使用这个消息
  7. sk = socket.socket()
  8. sk.bind(('127.0.0.1',9001))
  9. sk.listen()
  10.  
  11. conn,addr = sk.accept()
  12. rand = os.urandom(32)
  13. conn.send(rand)
  14.  
  15. sha = hashlib.sha1(secret_key)
  16. sha.update(rand)
  17. res = sha.hexdigest()
  18.  
  19. ret = conn.recv(1024).decode('utf-8')
  20. if ret == res:
  21. print('是合法的客户端')
  22. else:
  23. print('不是合法的客户端')
  24. conn.close()

server

  1. import socket
  2. import hashlib
  3.  
  4. secret_key = b'alexsb'
  5. sk = socket.socket()
  6. sk.connect(('127.0.0.1',9001))
  7.  
  8. rand = sk.recv(32)
  9.  
  10. sha = hashlib.sha1(secret_key)
  11. sha.update(rand)
  12. res = sha.hexdigest()
  13.  
  14. sk.send(res.encode('utf-8'))
  15.  
  16. sk.close()

client

hmac模块

  1. import os
  2. import hmac
  3.  
  4. hmac = hmac.new(b'alex sb',os.urandom(32))
  5. print(hmac.digest())

自动字节

为什么验证客户端 的合法性

  1. #__author : 'liuyang'
  2. #date : 2019/4/11 0011 上午 11:20
  3. # http # 登录博客园 用户名 明文(不安全)或者密文(小网站舍不得花钱)
  4. # https #发送用户名密码之后 内置特殊加密手段
  5.  
  6. # 防数据拦截 网安
  7.  
  8. # import socketserver
  9. # class Manager(socketserver.BaseRequestHandler):
  10. # def hander(self):
  11. # conn = self.request
  12. # print(conn)
  13. # socketserver.ThreadingTCPServer((),Manager)
  14. # socke
  15.  
  16. # 各个分校 向北京(客户端吗)推送招生信息 每晚12点
  17. # 劫持的人 获得了北京的ip 地址 扫端口
  18. # ip + port(循环或者猜) 别人给你发了不好的信息
  19. # 多个用同一个认真协定 多个登录的话太麻烦
  20.  
  21. # 不适一个面向用户的,需要用户自己输入用户名和密码的
  22. # 而是面向一台server 的所有的(500台)
  23. # 都是以一种我们共同的方式来进行一个验证
  24.  
  25. # server 端 密钥key: 客户端知道
  26. #生成随机的字符串 发给他 gdgadsgas #通过特殊的算法得到一个结果
  27. #再生成随机的字符串 发给他 dgadgasdg
  28. # 密钥+ 随机的字符串 通过特殊的算法得到一个结果 比对
  29. # 密钥+ 随机+特殊算法 难破解
  1. #__author : 'liuyang'
  2. #date : 2019/4/11 0011 上午 11:55
  3. import os
  4. import hashlib
  5. import socket
  6. secret_key= b'liuyang'
  7. ret = os.urandom(32) #给每一个客户端发送一个随机的字符串,来保证即使数据被拦截你也不能使用这个信息
  8. print(ret)#b'lK\x12\xb4\xabc\xd92Q%\xd5\x05\x0fz\xf2cg\xb8b\x0c?\xf13\xf3\x92:\x91\x00\x079\xdf\x9d'
  9. sk = socket.socket()
  10. sk.bind(('127.0.0.1',9000))
  11. sk.listen()
  12. conn,addr = sk.accept()
  13. conn.send(ret)
  14.  
  15. sha = hashlib.sha1(secret_key)
  16. sha.update(ret)
  17. res1 = sha.hexdigest()
  18. ret = conn.recv(1024).decode('utf-8')
  19.  
  20. if ret == res1:
  21. print('是')
  22. else:
  23. print('不适')

md5 版本的 server

  1. #__author : 'liuyang'
  2. #date : 2019/4/11 0011 下午 12:02
  3. import socket
  4. import hashlib
  5. sercet_key = b'liuyang'
  6. sk = socket.socket()
  7. sk.connect(('127.0.0.1',9000))
  8.  
  9. rand = sk.recv(32)
  10. sha = hashlib.sha1(sercet_key)
  11. sha.update(rand)
  12. res1 = sha.hexdigest()
  13. sk.send(res1.encode('utf-8'))
  14.  
  15. sk.close()

并发

  1. #__author : 'liuyang'
  2. #date : 2019/4/11 0011 上午 10:40
  3. # while True conn.close()
  4. # 一个连 另一个不能连
  5. import socketserver #原生socket(底层)的 上层
  6. #socketserver(底层)模块
  7. #socketserver网络连接这个操作是socket模块实现的
  8. import time
  9. # 同时接受多个 所有有写了一个 还有太多了
  10. class Myserver(socketserver.BaseRequestHandler):
  11. def handle(self): #必须继承这个类 重写方法两个不可改 类名可改
  12. conn = self.request #这个就是conn 只要有人连 执行handle
  13. for i in range(200):
  14. # print(self.request)
  15. conn.send(('hello%s'%i).encode('utf-8'))
  16.  
  17. msg = conn.recv(1023)
  18. print(msg)
  19. time.sleep(0.5)
  20. server = socketserver.ThreadingTCPServer(('127.0.0.1',9001),Myserver) #t现成
  21. server.serve_forever()
  22. '''
  23. server 端给每一个client 提供相同的服务'''
  24.  
  25. # 实例化 socket 去绑定端口listen ThreadingTCPServer
  26. # accept server.serve_forever() 做的
  27.  
  28. # self.handle() 执行子类的 没有 init 执行init 的 里面有self.handle()
  29. # 没有self.handle1() 所以不能改handle() #源码里经常遇到
  30. # 源码很混乱

server

  1. import socket
  2. sk = socket.socket()
  3. sk.connect(('127.0.0.1',9001))
  4.  
  5. while True:
  6. msg = sk.recv(1024)
  7. print(msg)
  8. sk.send(msg)
  9. sk.close()

client

  1. import socketserver #原生socket(底层)的 上层
  2. import time
  3. class Myserver(socketserver.BaseRequestHandler):
  4. def handle(self): #必须继承这个类 重写方法两个不可改 类名可改
  5. conn = self.request #这个就是conn 只要有人连 执行handle
  6. for i in range(200):
  7. conn.send(('hello%s'%i).encode('utf-8'))
  8.  
  9. msg = conn.recv(1023)
  10. print(msg)
  11. time.sleep(0.5)
  12. server = socketserver.ThreadingTCPServer(('127.0.0.1',9001),Myserver) #t现成
  13. server.serve_forever()
  1. #__author : 'liuyang'
  2. #date : 2019/4/11 0011 上午 10:48
  3. import socket
  4. sk = socket.socket()
  5. sk.connect(('127.0.0.1',9001))
  6.  
  7. while True:
  8. msg = sk.recv(1024)
  9. print(msg)
  10. sk.send(msg)
  11. sk.close()

登录

  1. import json
  2. import struct
  3. import socket
  4. sk = socket.socket()
  5. sk.bind(('127.0.0.1',9001))
  6. sk.listen()
  7. conn,addr = sk.accept()
  8. def shou(conn):
  9. len_bytes = conn.recv(4)
  10. num = struct.unpack('i',len_bytes)[0]
  11. str_dic = conn.recv(num).decode('utf-8')
  12. dic = json.loads(str_dic)
  13. print(dic)
  14. with open(dic['filename'],'wb')as f:
  15. while dic['filesize']: #一直减 不为0
  16. content = conn.recv(2048) #超过1500 带宽 拆包了
  17. print(len(content))
  18. f.write(content)
  19. dic['filesize'] -= len(content)
  20. shou(conn)
  21. conn.close()
  22. sk.close()

server

  1. import socket
  2. import os
  3. import json
  4. import struct
  5. sk = socket.socket()
  6. sk.connect(('127.0.0.1',9001))
  7. def chuan(sk):
  8. filepath = input('请输入文件路径 :')
  9. filename = os.path.basename(filepath)
  10. filesize = os.path.getsize(filepath)
  11. dic = {'filesize':filesize,'filename':filename}
  12. str_dic = json.dumps(dic)
  13. bytes_dic = str_dic.encode('utf-8')
  14. len_bytes = struct.pack('i',len(bytes_dic))
  15. sk.send(len_bytes)
  16. sk.send(bytes_dic)
  17. with open(filepath,'rb') as f:
  18. while filesize > 2048:
  19. content = f.read(2048)
  20. print(len(content))
  21. sk.send(content)
  22. filesize -= 2048
  23. else: #最后读剩下的 不用判断
  24. content = f.read()
  25. sk.send(content)
  26. chuan(sk)
  27. sk.close()

teacher

  1. import json
  2. import socket
  3. import struct
  4. import hashlib
  5. def get_md5(usr,pwd):
  6. md5 = hashlib.md5(usr.encode('utf-8'))
  7. md5.update(pwd.encode('utf-8'))
  8. return md5.hexdigest()
  9.  
  10. def login(conn):
  11. msg = conn.recv(1024).decode('utf-8')
  12. dic = json.loads(msg)
  13. with open('userinfo', encoding='utf-8') as f:
  14. for line in f:
  15. username, password = line.strip().split('|')
  16. if username == dic['user'] and password == get_md5(dic['user'], dic['passwd']):
  17. res = json.dumps({'flag': True}).encode('utf-8')
  18. conn.send(res)
  19. return True
  20. else:
  21. res = json.dumps({'flag': False}).encode('utf-8')
  22. conn.send(res)
  23. return False
  24.  
  25. def upload(conn):
  26. len_bytes = conn.recv(4)
  27. num = struct.unpack('i', len_bytes)[0]
  28. str_dic = conn.recv(num).decode('utf-8')
  29. dic = json.loads(str_dic)
  30.  
  31. with open(dic['filename'], 'wb') as f:
  32. while dic['filesize']:
  33. content = conn.recv(2048)
  34. f.write(content)
  35. dic['filesize'] -= len(content)
  36.  
  37. sk = socket.socket()
  38. sk.bind(('127.0.0.1',9001))
  39. sk.listen()
  40. while True:
  41. try:
  42. conn,addr = sk.accept()
  43. ret = login(conn)
  44. if ret:
  45. upload(conn)
  46. except Exception as e:
  47. print(e)
  48. finally:
  49. conn.close()
  50. sk.close()
  1. import os
  2. import json
  3. import socket
  4. import struct
  5.  
  6. def upload(sk):
  7. # 上传文件
  8. file_path = input('>>>')
  9. filename = os.path.basename(file_path)
  10. filesize = os.path.getsize(file_path)
  11. dic = {'filename': filename, 'filesize': filesize}
  12. bytes_dic = json.dumps(dic).encode('utf-8')
  13.  
  14. len_bytes = struct.pack('i', len(bytes_dic))
  15. sk.send(len_bytes)
  16. sk.send(bytes_dic)
  17.  
  18. with open(file_path, 'rb') as f:
  19. while filesize > 2048:
  20. content = f.read(2048)
  21. sk.send(content)
  22. filesize -= 2048
  23. else:
  24. content = f.read()
  25. sk.send(content)
  26.  
  27. usr = input('username :')
  28. pwd = input('password :')
  29. dic = {'operate':'login','user':usr,'passwd':pwd}
  30. bytes_dic = json.dumps(dic).encode('utf-8')
  31. sk = socket.socket()
  32. sk.connect(('127.0.0.1',9001))
  33. sk.send(bytes_dic)
  34.  
  35. res = sk.recv(1024).decode('utf-8')
  36. dic = json.loads(res)
  37. if dic['flag']:
  38. print('登录成功')
  39. upload(sk)
  40. else:
  41. print('登录失败')
  42.  
  43. sk.close()

client

自己

  1. import socket
  2. import os
  3. import json
  4. import struct
  5. sk = socket.socket()
  6. sk.connect(('127.0.0.1',9001))
  7. def chuan(sk):
  8. filepath = input('请输入文件路径 :')
  9. filename = os.path.basename(filepath)
  10. filesize = os.path.getsize(filepath)
  11. dic = {'filesize':filesize,'filename':filename}
  12. str_dic = json.dumps(dic)
  13. bytes_dic = str_dic.encode('utf-8')
  14. len_bytes = struct.pack('i',len(bytes_dic))
  15. sk.send(len_bytes)
  16. sk.send(bytes_dic)
  17. with open(filepath,'rb') as f:
  18. while filesize > 2048:
  19. content = f.read(2048)
  20. print(len(content))
  21. sk.send(content)
  22. filesize -= 2048
  23. else: #最后读剩下的 不用判断
  24. content = f.read()
  25. sk.send(content)
  26. flag = sk.recv(1034).decode('utf-8')
  27. print(flag)
  28. def login(sk):
  29. user = input('username:')
  30. pwd = input('password')
  31. dic = {'operate':'login','user':user,'pwd':pwd}
  32. bytes_dic = json.dumps(dic).encode('utf-8')
  33. sk.send(bytes_dic)
  34. res = sk.recv(1024).decode('utf-8')
  35. dic = json.loads(res)
  36. if dic['flag']:
  37. print('登录成功')
  38. return True
  39. # 文件上传
  40. else:
  41. print('登录失败')
  42. return False
  43. def again_upload(sk):
  44.  
  45. # len_bytes = sk.recv(4)
  46. # num = struct.unpack('i', len_bytes)[0]
  47. # str_dic = sk.recv(num).decode('utf-8')
  48. # dic = json.loads(str_dic)
  49. # print(dic)
  50. # with open(dic['filename'], 'wb')as f:
  51. # while dic['filesize']: # 一直减 不为0
  52. # content = sk.recv(2048) # 超过1500 带宽 拆包了
  53. # print(len(content))
  54. # f.write(content)
  55. # dic['filesize'] -= len(content)
  56. # 到最后都发送过来内容 文件大小一直减 到最后为零了
  57. # sk.close()
  58. with open('xiazai', 'wb')as f:
  59. a = sk.recv(100000000)
  60. f.write(a)
  61. # login(sk)
  62. # 合起来 不同的功能放在不同的函数里面
  63. # 判断了 先登录再上传
  64. global xiazai1
  65. if login(sk) :
  66. chuan(sk)
  67. print('传输完')
  68. xiazai1 = True
  69. else:
  70. print('没传输')
  71.  
  72. # if flag=='Y':
  73. # again_upload(sk)
  74. # print('接受完')
  75. # else:
  76. # print('没接收完')
  77. sk.close()
  78. # '''

client

  1. #__author : 'liuyang'
  2. #date : 2019/4/11 0011 下午 4:46
  3. #__author : 'liuyang'
  4. #date : 2019/4/11 0011 下午 3:16
  5. # '''
  6. import socket
  7. import os
  8. import json
  9. import struct
  10. sk = socket.socket()
  11. sk.connect(('127.0.0.1',9001))
  12. def chuan(sk):
  13. filepath = input('请输入文件路径 :')
  14. filename = os.path.basename(filepath)
  15. filesize = os.path.getsize(filepath)
  16. dic = {'filesize':filesize,'filename':filename}
  17. str_dic = json.dumps(dic)
  18. bytes_dic = str_dic.encode('utf-8')
  19. len_bytes = struct.pack('i',len(bytes_dic))
  20. sk.send(len_bytes)
  21. sk.send(bytes_dic)
  22. with open(filepath,'rb') as f:
  23. while filesize > 2048:
  24. content = f.read(2048)
  25. print(len(content))
  26. sk.send(content)
  27. filesize -= 2048
  28. else: #最后读剩下的 不用判断
  29. content = f.read()
  30. sk.send(content)
  31. flag = sk.recv(1034).decode('utf-8')
  32. print(flag)
  33. def login(sk):
  34. user = input('username:')
  35. pwd = input('password')
  36. dic = {'operate':'login','user':user,'pwd':pwd}
  37. bytes_dic = json.dumps(dic).encode('utf-8')
  38. sk.send(bytes_dic)
  39. res = sk.recv(1024).decode('utf-8')
  40. dic = json.loads(res)
  41. if dic['flag']:
  42. print('登录成功')
  43. return True
  44. # 文件上传
  45. else:
  46. print('登录失败')
  47. return False
  48. def again_upload(sk):
  49.  
  50. # len_bytes = sk.recv(4)
  51. # num = struct.unpack('i', len_bytes)[0]
  52. # str_dic = sk.recv(num).decode('utf-8')
  53. # dic = json.loads(str_dic)
  54. # print(dic)
  55. # with open(dic['filename'], 'wb')as f:
  56. # while dic['filesize']: # 一直减 不为0
  57. # content = sk.recv(2048) # 超过1500 带宽 拆包了
  58. # print(len(content))
  59. # f.write(content)
  60. # dic['filesize'] -= len(content)
  61. # 到最后都发送过来内容 文件大小一直减 到最后为零了
  62. # sk.close()
  63. with open('xiazai', 'wb')as f:
  64. a = sk.recv(100000000)
  65. f.write(a)
  66. # login(sk)
  67. # 合起来 不同的功能放在不同的函数里面
  68. # 判断了 先登录再上传
  69. global xiazai1
  70. if login(sk) :
  71. chuan(sk)
  72. print('传输完')
  73. xiazai1 = True
  74. else:
  75. print('没传输')
  76.  
  77. # if flag=='Y':
  78. # again_upload(sk)
  79. # print('接受完')
  80. # else:
  81. # print('没接收完')
  82. sk.close()
  83. # '''

server

day30的更多相关文章

  1. Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析

    Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析 今天通过集群运行模式观察.研究和透彻的刨析SparkStreaming的日志和web监控台. Day28 ...

  2. python 全栈开发,Day30(纸牌游戏,异常和错误,异常处理)

    一.纸牌游戏                                                                                              ...

  3. day30 主机管理-堡垒机3-操作记录

    课堂代码:https://github.com/liyongsan/git_class/tree/master/day30

  4. day30——socket套接字(完全版)

    day30 基于TCP协议的socket循环通信 server import socket phone = socket.socket() phone.bind(("127.0.0.1&qu ...

  5. day30线程(Threads)

    day30线程(Threads) 1.开启线程 一.什么是线程: 1.进程是资源分配的最小单位,线程是CPU调度的最小单位.每一个进程中至少有一个线程. 2.主进程中的线程称为主线程,其他开启的线程称 ...

  6. 碎碎念,浅饮-------Day30

    这不是关于技术的文章,它偏离了我原来的计划轨迹.但,我相信这将是远远超出了技术的意义使我无论什么价格值. 高考已经开始,不知道在这片宁静的夜空下有多少人已经美美的睡了,香甜憨然.又有多少人这睡着的眼角 ...

  7. DAY30、网络编程

    一.网络编程 软件开发 c/s架构 c:客户端 s:服务端 b/s架构 b:浏览器 s:服务端 本质:b/s其实也是c/s 服务端:24小时不间断提供服务,谁来救服务谁 客户端:想什么时候体验服务,就 ...

  8. day30 网络编程 之进程,线程,协程

    进程点进去 线程点进去 协程点进去 什么是进程 进程(有时称为重量级进程)是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.同一个程序执行两次,属于是两个不 ...

  9. 【Java入门提高篇】Day30 Java容器类详解(十二)TreeMap详解

    今天来看看Map家族的另一名大将——TreeMap.前面已经介绍过Map家族的两名大将,分别是HashMap,LinkedHashMap.HashMap可以高效查找和存储元素,LinkedHashMa ...

随机推荐

  1. Github访问速度慢和下载慢的解决方法

    原因 为什么访问速度慢.下载慢?github的CDN被某墙屏了,由于网络代理商的原因,所以访问下载很慢.Ping github.com 时,速度只有300多ms. 解决方法 绕过dns解析,在本地直接 ...

  2. SPI、I2C、UART、I2S、GPIO、SDIO、CAN 简介

    转自http://sanwen.net/a/fmxnjoo.html SPI.I2C.UART.I2S.GPIO.SDIO.CAN,看这篇就够了 总线 总线,总要陷进里面.这世界上的信号都一样,但是总 ...

  3. 【比赛打分展示双屏管理系统-专业版】Other.ini 配置文件解读以及排行榜界面及专家评语提交展示等具体配置

    第一个问题:Other.ini配置文件的解读: 在软件根目录下,找到Other.ini配置文件,打开如下: 配置文件解读: iOrderIDOrXSID:默认为0,按照软件 选项/排行榜和奖项 的设置 ...

  4. redis的缓冲击穿|缓冲雪崩|缓冲淘汰

    Redis 的缓存穿透和击穿 查询数据 缓存中有,从缓存中返回 缓存中没有,从数据库中查找,数据库中命中结果 ,将查询到的数据保存到缓存中 缓存中没有,从数据库中查找,数据库中也没有 , 不在缓存中保 ...

  5. IIS下https配置及安全整改

    原文链接:https://www.cnblogs.com/JangoJing/p/6769759.html 1.https证书的分类 SSL证书没有所谓的"品质"和"等级 ...

  6. leetcode337

    /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...

  7. Echarts绘制横向柱状图

    效果图: 关键配置: 将xAxis的type设置为value, 将yAxis的type设置为category即可实现横向显示

  8. <Dare To Dream 团队>第一次作业:团队亮相

    队名:Dare To Dream 2.团队成员组成:学号/姓名(标记团队组长): 201571030333/绽玉林(组长) 201571030132/姚慧霞 201571030308/李金平    2 ...

  9. http://www.36dsj.com/archives/46131

    https://docs.growingio.com/Developer%20Document.html https://youdata.163.com/dash/39706/editor?pid=7 ...

  10. bazel build //tensorflow/examples/android:tensorflow_demo报错: fatal error: 'cuda_runtime.h' file not found

    In file included from ./third_party/eigen3/unsupported/Eigen/CXX11/Tensor:1:external/eigen_archive/u ...