#作業:傳輸大檔案的代碼,沒什麼好說的,#server.pyimport osimport jsonimport socketimport structfilepath = r'D:\1.py'sk = socket.socket()sk.bind(('127.0.0.1',9000))sk.listen()conn,addr = sk.accept()filename = os.path.basename(filepath)filesize = os.path.getsize(filepath)dic = {'filename':filename,'filesize':filesize}str_dic = json.dumps(dic).encode('utf-8')len_dic = len(str_dic)length = struct.pack('i',len_dic)conn.send(length) # dic的長度conn.send(str_dic) # dicwith open(filepath,'rb') as f: # 檔案 while filesize: content = f.read(4096) conn.send(content) filesize -= len(content)conn.close()sk.close()#client.pyimport jsonimport structimport socketsk = socket.socket()sk.connect(('127.0.0.1',9000))dic_len = sk.recv(4)dic_len = struct.unpack('i',dic_len)[0]dic = sk.recv(dic_len)str_dic = dic.decode('utf-8')dic = json.loads(str_dic)with open(dic['filename'],'wb') as f: while dic['filesize']: content = sk.recv(4096) dic['filesize'] -= len(content) f.write(content)sk.close()
#驗證用戶端合法的代碼,#server.pyimport osimport socketimport hmacsecret_key = '老衲洗頭用飄柔'.encode('utf-8') #伺服器端與用戶端,擁有相同的密鑰,sk = socket.socket()sk.bind(('127.0.0.1',9000))sk.listen()while True: try: conn,addr = sk.accept() random_bytes = os.urandom(32) #產生一個bytes類型的隨機數,然後發送到用戶端, conn.send(random_bytes) obj = hmac.new(key =secret_key,msg =random_bytes) #key是密鑰,msg是待加密的訊息, ret = obj.hexdigest() #得到加密的結果, msg = conn.recv(1024).decode('utf-8') #得到用戶端的加密結果 if msg == ret:print('是合法的用戶端') #如果相同,說明,用戶端和伺服器端的密鑰相同, else:conn.close() finally: sk.close() break#client.pyimport socketimport hmacsecret_key = '老衲洗頭用飄柔'.encode('utf-8')sk = socket.socket()sk.connect(('127.0.0.1',9000))urandom = sk.recv(1024) #得到伺服器的隨機數,hmac_obj = hmac.new(key = secret_key,msg =urandom) #進行加密,sk.send(hmac_obj.hexdigest().encode('utf-8')) #把加密結果發送給伺服器端,若相同則認證通過,sk.close()
#並發編程#server.pyimport socketserverclass MyServer(socketserver.BaseRequestHandler): def handle(self): self.request.send(b'hello') msg = self.request.recv(1024) print(msg) print(self.server) print(self.request) print(self.client_address)if __name__ == '__main__': socketserver.TCPServer.allow_reuse_address = True server = socketserver.ThreadingTCPServer(('127.0.0.1',9000),MyServer) server.serve_forever()#client.py#因為是並發,所以下面的用戶端程式可以運行多個.import socketsk = socket.socket()sk.connect(('127.0.0.1',9000))msg = sk.recv(1024)print(msg)sk.send(b'bye')sk.close()#下面部落格對socketserver寫的蠻好,#https://www.cnblogs.com/tianjianng/p/7712648.html#https://www.cnblogs.com/progor/p/8617042.html#https://blog.csdn.net/yannanxiu/article/details/51735452
import hmacobj = hmac.new(key = b'secret_key',msg =b'11010012922')print(obj.hexdigest())obj = hmac.new(key = b'secret_key',msg =b'11010012922')print(obj.hexdigest())