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的问题了