zoukankan      html  css  js  c++  java
  • python全栈开发 * 35 知识点汇总 * 180720

    35 socket 一些常用方法  验证客户端信息 添加随机字符串  socketserver模块  
    一.socket模块中一些常用方法
    1.send和sendall的区别
    2.conn.getpeername conn/ sk.getsockname
    3.setsockopt() 3.getsockopt()
    4.sk.setblocking()
    5.settimeout() gettimeout()

    二.客户端验证相关事宜
    第一版 验证客户端
    服务器:
    import socket
    import hashlib
    sk=socket.socket()
    sk.bind(("127.0.0.1",8809))
    sk.listen()
    conn,addr=sk.accept()
    key="天王盖地虎"
    ch="你好"
    conn.send(ch.encode("utf-8"))
    md5_obj=hashlib.md5(key.encode("utf-8"))
    md5_obj.update(ch.encode("utf-8"))
    re=md5_obj.hexdigest()
    client_re=conn.recv(1024).decode("utf-8")
    if re==client_re:
    print("你好,老铁")
    else:
    print("你是假冒用户")
    conn.close()
    sk.close()
    客户端:
    import socket
    import hashlib
    sk=socket.socket()
    sk.connect(("127.0.0.1",8809))
    key="天王盖地虎" #宝塔镇河妖
    ch=sk.recv(1024)
    md5_obj=hashlib.md5(key.encode("utf-8"))
    md5_obj.update(ch)
    re=md5_obj.hexdigest()
    sk.send(re.encode("utf-8"))

    sk.close()
    第二版 添加随机字符串
    服务器 (import os os.urandom(num))
    import socket
    import hashlib
    import os
    sk=socket.socket()
    sk.bind(("127.0.0.1",8809))
    sk.listen()
    conn,addr=sk.accept()
    key="天王盖地虎"
    ch=os.urandom(10) #===>字节
    conn.send(ch)
    md5_obj=hashlib.md5(key.encode("utf-8"))
    md5_obj.update(ch)
    re=md5_obj.hexdigest() #===>字符串
    client_re=conn.recv(1024).decode("utf-8")
    if re==client_re:
    print("你好,老铁")
    else:
    print("你是假冒用户")
    conn.close()
    sk.close()
    客户端
    import socket
    import hashlib
    sk=socket.socket()
    sk.connect(("127.0.0.1",8809))
    key="天王盖地虎" #宝塔镇河妖
    ch=sk.recv(1024)
    print(ch)
    md5_obj=hashlib.md5(key.encode("utf-8")) #(括号里应该是字节)
    md5_obj.update(ch) #(括号里应该是字节)
    re=md5_obj.hexdigest() #====>字节
    sk.send(re.encode("utf-8"))

    sk.close()
    第三版 用hmac加密方法
    服务器
    import socket
    import hmac #hmac 模块 (内置模块)
    import os
    sk=socket.socket()
    sk.bind(("127.0.0.1",8809))
    sk.listen()
    conn,addr=sk.accept()
    key="天王盖地虎" # 加盐
    ch=os.urandom(10) # os中的urandom方法(获取随机字符串) ===>字节
    conn.send(ch) #字节可以直接发送,无需编码
    obj=hmac.new(key.encode("utf-8"),ch) #模块hmac中的new方法给随机字符串 ch 加密赋值给obj
    re=obj.digest() #=====>直接返回Bytes类型
    # md5_obj=hashlib.md5(key.encode("utf-8"))
    # md5_obj.update(ch)
    # re=md5_obj.hexdigest() #===>字符串
    client_re=conn.recv(1024)
    if re==client_re:
    print("你好,老铁")
    else:
    print("你是假冒用户")
    conn.close()
    sk.close()

    客户端
    import socket
    import hmac # 内置模块hmac
    sk=socket.socket()
    sk.connect(("127.0.0.1",8809))
    key="天王盖地虎" # 加盐
    ch=sk.recv(1024) #接收到服务器发来的随机字符串 字节形式
    obj=hmac.new(key.encode("utf-8"),ch) #用模块hmac中的new方法给随机字符串加密,括号里必须都是字节形式
    re=obj.digest() #返回字节形式
    # md5_obj=hashlib.md5(key.encode("utf-8")) #(括号里应该是字节)
    # md5_obj.update(ch) #(括号里应该是字节)
    # re=md5_obj.hexdigest() #====>字符串
    sk.send(re) # 直接发送给服务器

    三.socketserver模块tcp中一个服务器同时连接多个客户端
    服务器
    客户登陆验证
    import socketserver
    import json
    import hashlib
    class Myserver(socketserver.BaseRequestHandler):
    def handle(self):
    dic_str=self.request.recv(1024).decode("utf-8")
    dic=json.loads(dic_str)
    with open("user_info",encoding="utf-8")as f:
    for i in f:
    username,password=i.split("|")
    if username==dic["username"]:
    md5_obj=hashlib.md5(dic["username"].encode('utf-8'))
    md5_obj.update(dic["password"].encode("utf-8"))
    re=md5_obj.hexdigest()
    if re == password.strip():
    self.request.send(b'success')
    else:
    self.request.send(b'failed')
    break
    else:
    self.request.send("用户名不存在".encode("utf-8"))



    server=socketserver.TCPServer(("127.0.0.1",8810),Myserver)
    server.serve_forever()
    客户端
    import socket
    import json
    import time

    sk=socket.socket()
    sk.connect(("127.0.0.1",8810))


    dic={"username":None,"password":None}
    while 1:
    username=input("姓名:")
    password=input("密码:")
    dic["username"]=username
    dic["password"]=password
    dic_str=json.dumps(dic)
    sk.send(dic_str.encode("utf-8"))
    print(sk.recv(1024))
  • 相关阅读:
    抽象类和接口
    回调函数
    Spring Aop、拦截器、过滤器的区别
    事务
    SQL 模糊查询条件的四种匹配模式
    shell编程(二)
    shell编程(一)
    shell介绍
    字符验证码
    selenium
  • 原文地址:https://www.cnblogs.com/J-7-H-2-F-7/p/9353309.html
Copyright © 2011-2022 走看看