python中怎么通過(guò)socket發(fā)送文件,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)公司是一家專(zhuān)注于成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計(jì),潮陽(yáng)網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:潮陽(yáng)等地區(qū)。潮陽(yáng)做網(wǎng)站價(jià)格咨詢(xún):18980820575目錄結(jié)構(gòu):
client:
#!/usr/bin/env python # -*-coding:utf-8 -*- import socket, struct, json download_dir = r'D:\Python\python_learning\gd\code\part3\02網(wǎng)絡(luò)編程\文件傳輸\client\download' gd_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) gd_client.connect(('127.0.0.1',8123))
while True:
#1、發(fā)命令 cmd=input('>>: ').strip() #get a.txt if not cmd:continue gd_client.send(cmd.encode('utf-8')) #2、以寫(xiě)的方式打開(kāi)一個(gè)新文件,接收服務(wù)端發(fā)來(lái)的文件的內(nèi)容寫(xiě)入客戶(hù)的新文件 #第一步:先收?qǐng)?bào)頭的長(zhǎng)度 obj=gd_client.recv(4) header_size=struct.unpack('i',obj)[0] # 第二步:再收?qǐng)?bào)頭 header_bytes = gd_client.recv(header_size) # 第三步:從報(bào)頭中解析出對(duì)真實(shí)數(shù)據(jù)的描述信息 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'] # 第四步:接收真實(shí)的數(shù)據(jù) 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 socket import subprocess import struct import json import os share_dir = r'D:\Python\python_learning\gd\code\part3\02網(wǎng)絡(luò)編程\文件傳輸\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給操作系統(tǒng)使用 gd_server.listen(5) while True: conn, client_addr = gd_server.accept() while True: # 通信循環(huán) try: # 1、收命令 res = conn.recv(8096) # b'get 1.txt' if not res: break # 適用于linux操作系統(tǒng) # 2、解析命令,提取相應(yīng)命令參數(shù) cmds = res.decode('utf-8').split() # ['get','1.txt'] filename = cmds[1] # 3、以讀的方式打開(kāi)文件,讀取文件內(nèi)容發(fā)送給客戶(hù)端 # 第一步:制作固定長(zhǎng)度的報(bào)頭 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') # 第二步:先發(fā)送報(bào)頭的長(zhǎng)度 conn.send(struct.pack('i',len(header_bytes))) # 第三步:再發(fā)報(bào)頭 conn.send(header_bytes) # 第四步:再發(fā)送真實(shí)的數(shù)據(jù) with open('%s/%s'%(share_dir, filename),'rb') as f: for line in f: conn.send(line) except ConnectionResetError: # 適用于windows操作系統(tǒng) break conn.close() gd_server.close()
命令輸入: get 1.txt ,然后即可將 server 端的 share文件內(nèi)的 1.txt 文件 發(fā)送到 client 端的 download文件夾下
圖片、視頻、文字都可以發(fā)送,因?yàn)閭魉偷氖?二進(jìn)制文件
原理是:server 端以讀的形式打開(kāi)文件,client端以寫(xiě) 的方式打開(kāi)文件,然后client端把 一條一條的二進(jìn)制寫(xiě)入文件后保存即可。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。