目录结构:
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