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的問題了