文章目录
一、粘包练习
完成文件上传下载:
服务端:
import socket
import struct
import json
import os
server = socket.socket()
server.bind(("127.0.0.1",9090))
server.listen()
def run():
while True:
client,addr = server.accept()
while True:
try:
# 接收报头
len_data = client.recv(4)
if not len_data:
print("客户端已断开....")
client.close()
break
head_len = struct.unpack("i",len_data)[0]
head = json.loads(client.recv(head_len).decode("utf-8"))
# 从报头中获取用户要执行的操作
if head["opt"] == "upload":
upload(head,client)
elif head["opt"] == "download":
download(head,client)
else:
print("请求错误!")
except ConnectionResetError:
print("客户端异常断开...")
client.close()
break
def upload(head,c):
dir_path = r"D:\上传下载\upload"
path = os.path.join(dir_path,head["filename"])
recv_size = 0
with open(path,"wb") as f:
while recv_size < head["size"]:
data = c.recv(1024)
f.write(data)
recv_size += len(data)
print("接收完成....!")
def download(head,c):
path = r"D:\选课系统\需求文档"
# 制作文件报头
file_info = {"filename":os.path.basename(path),"size":os.path.getsize(path)}
info_data = json.dumps(file_info).encode("utf-8")
info_len = struct.pack("i",len(info_data))
c.send(info_len)
c.send(info_data)
with open(path,"rb") as f:
while True:
data = f.read(1024)
if not data:
break
c.send(data)
print("发送完成...")
run()
客户端:
import socket
import os
import struct
import json
c = socket.socket()
c.connect(("127.0.0.1",9090))
def run():
print("""
1.上传
2.下载
3.退出""")
res = input("请选择功能:")
if res == "3":
return
elif res == "1":
upload()
elif res == "2":
download()
else:
print("输入错误!")
def upload():
path = r"D:\选课系统\需求文档"
# 制作文件报头
file_info = {"filename": os.path.basename(path), "size": os.path.getsize(path),"opt":"upload"}
info_data = json.dumps(file_info).encode("utf-8")
info_len = struct.pack("i", len(info_data))
c.send(info_len)
c.send(info_data)
with open(path, "rb") as f:
while True:
data = f.read(1024)
if not data:
break
c.send(data)
print("发送完成...")
def download():
# 制作报头
head = {"opt": "download"}
head_data = json.dumps(head).encode("utf-8")
head_len = struct.pack("i", len(head_data))
c.send(head_len)
c.send(head_data)
len_data = c.recv(4)
head_len = struct.unpack("i", len_data)[0]
head = json.loads(c.recv(head_len).decode("utf-8"))
dir_path = r"D:\上传下载\download"
path = os.path.join(dir_path, head["filename"])
recv_size = 0
with open(path, "wb") as f:
while recv_size < head["size"]:
data = c.recv(1024)
f.write(data)
recv_size += len(data)
print("接收完成....!")
run()
基于tcp的登陆注册:
客户端提交注册数据,服务器判断是否重复,并返回注册结果,用户数据写入文件,客户端提交都登陆数据,服务器判断是否得了成功,并返回登陆结果
数据交互直接用json 即可
- 发送json 长度
- 取出json 进行处理
服务端:
import socket
import struct
import json
import os
server = socket.socket()
server.bind(("127.0.0.1",9090))
server.listen()
def run():
while True:
client,addr = server.accept()
while True:
try:
# 接收报头
len_data = client.recv(4)
if not len_data:
print("客户端已断开....")
client.close()
break
head_len = struct.unpack("i",len_data)[0]
head = json.loads(client.recv(head_len).decode("utf-8"))
# 从报头中获取用户要执行的操作
if head["opt"] == "login":
res = login(head,client) # 调用登录,无论成功失败,都会得到一个结果
send_response(res,client) # 将结果发送给客户端
elif head["opt"] == "register":
res = register(head,client)# 调用注册,无论成功失败,都会得到一个结果
send_response(res,client)# 将结果发送给客户端
else:
print("请求错误!")
except ConnectionResetError:
print("客户端异常断开...")
client.close()
break
def login(head,client):
dir_path = r"D:\登录注册\user_data"
path = os.path.join(dir_path, head["name"])
if not os.path.exists(path):
response = {"status": "200", "msg": "用户名不存在!"}
return response
with open(path,"rt",encoding="utf-8") as f:
user_dic = json.load(f)
if user_dic["pwd"] == head["pwd"]:
response = {"status": "200", "msg": "登录成功!"}
return response
else:
response = {"status": "200", "msg": "密码错误!"}
return response
def register(head,client):
user_dic = {"name":head["name"],"pwd":head["pwd"]}
dir_path = r"D:\登录注册\user_data"
path = os.path.join(dir_path,head["name"])
if os.path.exists(path):
print("用户名已存在!")
response = {"status": "200", "msg": "用户名已存在!"}
return response
with open(path,"wt",encoding="utf-8") as f:
json.dump(user_dic,f)
response = {"status":"200","msg":"注册成功"}
return response
def send_response(resp,client):
response_data = json.dumps(resp).encode("utf-8")
client.send(struct.pack("i", len(response_data)))
client.send(response_data)
run()
客户端:
import socket
import struct
import json
c = socket.socket()
c.connect(("127.0.0.1",9090))
def run():
print("""
1.登录
2.注册
3.退出
""")
res = input("请选择功能:")
if res == "3":
return
elif res == "1":
login()
elif res == "2":
register()
else:
print("输入错误!")
def login():
name = input("name:")
pwd = input("password:")
dic = {"name":name,"pwd":pwd,"opt":"login"}
res = send_request(dic)
print(res)
def register():
name = input("name:")
pwd = input("password:")
dic = {"name":name,"pwd":pwd,"opt":"register"}
res = send_request(dic)
print(res)
def send_request(dic):
dic_data = json.dumps(dic).encode("utf-8")
c.send(struct.pack("i",len(dic_data)))
c.send(dic_data)
# 接收返回结果
res_len = struct.unpack("i",c.recv(4))[0]
res = json.loads(c.recv(res_len).decode("utf-8"))
return res
run()