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

2021-02-07 15:15

阅读:599

标签:==   代码   响应   enc   相关   ever   操作   客户端   lazy   

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(\n)
                        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(\n)
                                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的问题了

技术图片

 

 技术图片

 

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

标签:==   代码   响应   enc   相关   ever   操作   客户端   lazy   

原文地址:https://www.cnblogs.com/weiweivip666/p/13090747.html


评论


亲,登录后才可以留言!