python全栈开发技巧_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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值