目錄結構:
client:
#!/usr/bin/env python# -*-coding:utf-8 -*-import socket, struct, jsondownload_dir = r'D:/Python/python_learning/gd/code/part3/02網絡編程/文件傳輸/client/download'gd_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)gd_client.connect(('127.0.0.1',8123))while True:
 #1、發命令  cmd=input('>>: ').strip() #get a.txt  if not cmd:continue  gd_client.send(cmd.encode('utf-8'))  #2、以寫的方式打開一個新文件,接收服務端發來的文件的內容寫入客戶的新文件  #第一步:先收報頭的長度  obj=gd_client.recv(4)  header_size=struct.unpack('i',obj)[0]  # 第二步:再收報頭  header_bytes = gd_client.recv(header_size)  # 第三步:從報頭中解析出對真實數據的描述信息  header_json = header_bytes.decode('utf-8')  header_dic = json.loads(header_json)  '''  header_dic = {    'filename': filename, # 1.txt    'file_size': os.path.getsize(r'%s/%s' % (share_dir, filename)) # 路徑/1.txt  }    '''  total_size = header_dic['file_size']  file_name = header_dic['filename']  # 第四步:接收真實的數據  with open(r'%s/%s'%(download_dir, file_name),'wb') as f:    recv_size = 0    while recv_size < total_size:      line = gd_client.recv(1024)      f.write(line)      recv_size += len(line)      print('總大小:%s  已下載大小:%s' % (total_size, recv_size))gd_client.close()?server:
#!/usr/bin/env python# -*-coding:utf-8 -*-import socketimport subprocessimport structimport jsonimport osshare_dir = r'D:/Python/python_learning/gd/code/part3/02網絡編程/文件傳輸/server/share'gd_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)gd_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)gd_server.bind(('127.0.0.1', 8123)) # 0-65535: 0-1024給操作系統使用gd_server.listen(5)while True:  conn, client_addr = gd_server.accept()  while True: # 通信循環    try:      # 1、收命令      res = conn.recv(8096) # b'get 1.txt'      if not res: break # 適用于linux操作系統      # 2、解析命令,提取相應命令參數      cmds = res.decode('utf-8').split() # ['get','1.txt']      filename = cmds[1]      # 3、以讀的方式打開文件,讀取文件內容發送給客戶端      # 第一步:制作固定長度的報頭      header_dic = {        'filename': filename, # 1.txt        'file_size':os.path.getsize(r'%s/%s'%(share_dir, filename)) # 路徑/1.txt      }      header_json = json.dumps(header_dic)      header_bytes = header_json.encode('utf-8')      # 第二步:先發送報頭的長度      conn.send(struct.pack('i',len(header_bytes)))      # 第三步:再發報頭      conn.send(header_bytes)      # 第四步:再發送真實的數據      with open('%s/%s'%(share_dir, filename),'rb') as f:        for line in f:          conn.send(line)    except ConnectionResetError: # 適用于windows操作系統      break  conn.close()gd_server.close()?命令輸入: get 1.txt ,然后即可將 server 端的 share文件內的 1.txt 文件 發送到 client 端的 download文件夾下
圖片、視頻、文字都可以發送,因為傳送的是 二進制文件
原理是:server 端以讀的形式打開文件,client端以寫 的方式打開文件,然后client端把 一條一條的二進制寫入文件后保存即可。
總結
以上所述是小編給大家介紹的python 通過 socket 發送文件的實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!
新聞熱點
疑難解答