python 通过 socket 发送文件

当前位置:首页千亿平台官方APP >

千亿平台官方APP

python 通过 socket 发送文件

时间:2019-11-29本站浏览次数:238

       

目录结构:

client:

#!/usr/bin/env python# -*-coding:utf-8 -*-import socket, struct, jsondownload_dir = r"D:Pythonpython_learninggdcodepart3网络编程文件传输clientdownload"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:Pythonpython_learninggdcodepart3网络编程文件传输servershare"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端把 一条一条的二进制写入文件后保存即可。




公司地址:吉林市长春市长春惠工生产资料市场15栋18号
联系人:石象焰 15812740555
乔志科 13699512289
电话:15374684697 传真:gi6w7kynz@163.com
邮箱:42wmh86@sohu.com

粤公网安备 44030702001579号

千亿体育最新网站@