• 关于json序列化时报错json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)


    1.今天在写客户端与服务端交互的程序的时候,发现了一个问题

    客户端代码

    #客户端程序主要是发送注册请求/登录请求给服务端,服务端接收响应后回应对应的应答给客户端,客户端接收响应后,然后做一些操作

    # ### 客户端
    import socket
    import hashlib
    import json
    
    def register(sk):
        name = input('请输入注册用户名')
        pwd = input("请输入注册密码")
        pwd2 = input("请再次输入注册密码")
        dic = {'username':name,'password':pwd,'password2':pwd,'status':1}
        sk.send(json.dumps(dic).encode())
        res = sk.recv(1024)
        return res
    
    def login(sk):
        name = input('请输入账户')
        pwd = input('请输入密码')
        hs = hashlib.md5()
        hs.update(pwd.encode())
        res = hs.hexdigest()
        dic = {'username': name, 'password': res, 'password2': res, 'status': 2}
        #发送数据
        sk.send(json.dumps(dic).encode())
        res = sk.recv(1024)
        return res
    #1.创建对象
    sk = socket.socket()
    
    #2.创建连接
    sk.connect(('127.0.0.1',9001))
    
    #.接收发数据
    num = input('请输入注册1,登陆2')
    if num == '1':
        res = register(sk)
        print(res.decode())
    elif num == '2':
        res = login(sk)
        print(res.decode())
    else:
        print("输入有误请重新输入")
    
    #断开连接
    sk.close()

    服务端代码

    # ### 服务端
    import hashlib
    import json
    import socketserver
    import os
    
    class MyServer(socketserver.BaseRequestHandler):
        def handle(self):
            conn = self.request
            while True:
                msg = conn.recv(1024)#接收的是字节流
                strvar = msg.decode() #转换为字符串
                print(strvar)
                json.loads(strvar) #反序列化成字典
                print(json)
                # if not msg:break  #先把这段话去掉
                if json.loads(msg.decode())['status'] == 1:
                    with open('mysql.json','r+',encoding='utf-8') as fp:
                        if not os.path.getsize('mysql.json'):
                            hs = hashlib.md5()
                            hs.update(json.loads(msg.decode())['password'].encode())
                            hs_res = hs.hexdigest()
                            dic = {"username": json.loads(msg.decode())['username'], "password": hs_res}
                            json.dump(dic, fp)
                            fp.write('
    ')
                            print('注册成功')
                            conn.send('注册成功'.encode())
                            break
                        else:
                            for i in fp:
                                dic_res = json.loads(i)
                                if dic_res["username"] == json.loads(msg.decode())['username']:
                                    print('用户名已注册')
                                    conn.send("用户名已注册".encode())
                                    break
                                elif json.loads(msg.decode())['username'] not in dic_res["username"]:
                                    hs = hashlib.md5()
                                    hs.update(json.loads(msg.decode())['password'].encode())
                                    hs_res = hs.hexdigest()
                                    dic = {"username":json.loads(msg.decode())['username'],"password":hs_res}
                                    json.dump(dic,fp)
                                    fp.write('
    ')
                                    print('注册成功')
                                    conn.send('注册成功'.encode())
                                    break
                elif  json.loads(msg.decode())['status'] == 2:
                    with open('mysql.json', 'r', encoding='utf-8') as fp:
                        for i in fp:
                            dic_res = json.loads(i)
                            if dic_res["username"] == json.loads(msg.decode())['username'] and dic_res["password"] == json.loads(msg.decode())['password']:
                                print('账户密码正确,登录成功')
                                conn.send('账户密码正确,登录成功'.encode())
                                break
                            else:
                                print('账户或密码错误')
                                conn.send('账户或密码错误'.encode())
                                break
    
    
    server = socketserver.ThreadingTCPServer(('127.0.0.1',9001),MyServer)
    server.serve_forever()

    问题主要出现在客户端发送请求给服务端的时候,服务端报了个json.decoder.JSONDecodeError的问题,但是客户端最后运行的结果显示是正确的

    下面是服务端报的错误

     首先我在客户端找了下,发送的数据是没有问题的

     然后去服务端在接收字节流的时候发现出现了问题

     然而在打印屏幕上服务端显示的却是这样,多了次接收并打印,很显然是又传了一次空的字节过来,然后在网上找了一下解决办法,都没有相关的解决办法,都说是跟单引号双引号的关系,然而并不是,最后我想了个办法,它这边会多传一个空字节过来,我服务端接收的时候,加了个判断,if not msg:break ,然后把前面的打印全删了,只留一个msg来接收客户端传过来的字节, 然后再运行的时候,服务端就没有这种JsonDecondeError的问题了

     

  • 相关阅读:
    Gym
    [APIO2014] 回文串
    python选课系统
    python面向对象之类成员修饰符
    python面向对象之类成员
    python的shelve模块
    python的re模块
    python的configparser模块
    python的sys和os模块
    python的hashlib模块
  • 原文地址:https://www.cnblogs.com/weiweivip666/p/13090747.html
Copyright © 2020-2023  润新知