python 通過 socket 發(fā)送文件的實例代碼
目錄結(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、以寫的方式打開一個新文件,接收服務(wù)端發(fā)來的文件的內(nèi)容寫入客戶的新文件
#第一步:先收報頭的長度
obj=gd_client.recv(4)
header_size=struct.unpack('i',obj)[0]
# 第二步:再收報頭
header_bytes = gd_client.recv(header_size)
# 第三步:從報頭中解析出對真實數(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ù)據(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、以讀的方式打開文件,讀取文件內(nèi)容發(fā)送給客戶端
# 第一步:制作固定長度的報頭
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ā)送報頭的長度
conn.send(struct.pack('i',len(header_bytes)))
# 第三步:再發(fā)報頭
conn.send(header_bytes)
# 第四步:再發(fā)送真實的數(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ā)送,因為傳送的是 二進制文件
原理是:server 端以讀的形式打開文件,client端以寫 的方式打開文件,然后client端把 一條一條的二進制寫入文件后保存即可。
總結(jié)
以上所述是小編給大家介紹的python 通過 socket 發(fā)送文件的實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
對python產(chǎn)生隨機的二維數(shù)組實例詳解
今天小編就為大家分享一篇對python產(chǎn)生隨機的二維數(shù)組實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
Python實現(xiàn)指定范圍內(nèi)篩選并剔除Excel表格中的數(shù)據(jù)
這篇文章主要為大家詳細介紹了Python如何實現(xiàn)在指定范圍內(nèi)篩選并剔除Excel表格中的數(shù)據(jù),文中的示例代碼講解詳細,感興趣的可以了解一下2023-06-06
python利用openpyxl拆分多個工作表的工作簿的方法
這篇文章主要介紹了python利用openpyxl拆分多個工作表的工作簿的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09

