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))