目录结构:
client:
while True:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#!/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网络编程\文件传输\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 发送文件的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:https://www.cnblogs.com/friday69/p/9474580.html