python-粘包练习

文章目录

一、粘包练习

完成文件上传下载:

服务端:

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 即可

  1. 发送json 长度
  2. 取出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()

猜你喜欢

转载自blog.csdn.net/zdc45625/article/details/85298451