python socket文件传输实现
简单版
server(服务端)
import socket
import subprocess
import struct
import json
import os share_dir = r'E:\server\share' # 需要传输的文件所在的文件夹 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 回收重用端口10000
phone.bind(('127.0.0.1', 10000)) # 0-65535 0-1024给操作系统,
phone.listen(5)
print('stearting')
while True: # 建链接循环
conn, client_addr = phone.accept()
print(client_addr)
while True: # 通信循环
try:
# 1.收命令
res = conn.recv(1024) # get jiaoyue.mp4
# 2.解析命令,提取相应命令参数
cmds = res.decode('utf-8').split() # ['get', 'jiaoyue.mp4']
filename = cmds[1]
# 3.以读的方式打开 # 1制作报头
header_dic = {
'filename': filename,
'md5': 'xxdxx',
'file_size': os.path.getsize(r'%s/%s' % (share_dir, filename)) #E:\study\第3模块,面向对象\网络编程\文件传输\server\share\jiaoyue.mp4
}
header_json = json.dumps(header_dic)
header_bytes = header_json.encode('utf-8') # 2 发送报头长度
conn.send(struct.pack('i', len(header_bytes))) # 固定长度4 # 3 发报头
conn.send(header_bytes)
# 4发真实数据
with open('%s/%s' % (share_dir, filename), 'rb') as f:
# conn.send(f.read())
for a in f:
conn.send(a)
except ConnectionResetError:
break
conn.close()
phone.close()
client(客户端)
import socket
import struct
import json download_dir = r'E:\client\download' # 文件存放地址 pc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
pc.connect(('127.0.0.1', 10000)) while True:
# 1.发命令
cmd = input('>>>:').strip() # get a.text
if not cmd:
continue
pc.send(cmd.encode('utf-8')) # 2.接受文件内容,以写的方式打开一个新文件,写入客户端新文件中 # 1收报头长度
obj = pc.recv(4)
header_size = struct.unpack('i', obj)[0] # 2接收报头
header_bytes = pc.recv(header_size) # 3解析报头,对于数据的描述
header_json = header_bytes.decode('utf-8')
header_dic = json.loads(header_json)
print(header_dic)
total_size = header_dic['file_size']
file_name = header_dic['filename'] # 4 接受真实的数据
with open('%s/%s' % (download_dir, file_name), 'wb') as f:
recv_size = 0
while recv_size < total_size:
res = pc.recv(1024)
f.write(res)
recv_size += len(res)
print('总大小:%s 已经下载大小:%s' % (total_size, recv_size)) pc.close()
优化之后的版本
server
import socket
import struct
import json
import os share_dir = r'E:\server\share' # 文件地址 def get(cmds, conn):
filename = cmds[1]
# 3.以读的方式打开,读取文件
# 1制作报头
header_dic = {
'filename': filename,
'md5': 'xxdxx',
'file_size': os.path.getsize(r'%s/%s' % (share_dir, filename)) # E:\study\第3模块,面向对象\网络编程\文件传输\server\share\jiaoyue.mp4
}
header_json = json.dumps(header_dic)
header_bytes = header_json.encode('utf-8') # 2 发送报头长度
conn.send(struct.pack('i', len(header_bytes))) # 固定长度4 # 3 发报头
conn.send(header_bytes)
# 4发真实数据
with open('%s/%s' % (share_dir, filename), 'rb') as f:
# conn.send(f.read())
for a in f:
conn.send(a) def put(pc):
# 2.接受文件内容,以写的方式打开一个新文件,写入客户端新文件中
# 1收报头长度
obj = pc.recv(4)
header_size = struct.unpack('i', obj)[0] # 2接收报头
header_bytes = pc.recv(header_size) # 3解析报头,对于数据的描述
header_json = header_bytes.decode('utf-8')
header_dic = json.loads(header_json)
print(header_dic)
total_size = header_dic['file_size']
file_name = header_dic['filename'] # 4 接受真实的数据
with open('%s/%s' % (share_dir, file_name), 'wb') as f:
recv_size = 0
while recv_size < total_size:
res = pc.recv(1024)
f.write(res)
recv_size += len(res)
print('总大小:%s 已经下载大小:%s' % (total_size, recv_size)) def run():
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 回收重用端口10000
phone.bind(('127.0.0.1', 10000)) # 0-65535 0-1024给操作系统,
phone.listen(5)
while True: # 建链接循环
conn, client_addr = phone.accept()
print(client_addr)
while True: # 通信循环
try:
# 1.收命令
res = conn.recv(1024) # get jiaoyue.mp4
# 2.解析命令,提取相应命令参数
cmds = res.decode('utf-8').split() # ['get', 'jiaoyue.mp4']
if cmds[0] == 'get':
get(cmds, conn)
elif cmds[0] == 'put':
put(conn)
except ConnectionResetError:
break
conn.close()
phone.close() if __name__ == '__main__':
run()
client
import socket
import struct
import json
import os download_dir = r'E:\client\download' # 文件存放地址 def get(pc):
# 2.接受文件内容,以写的方式打开一个新文件,写入客户端新文件中
# 1收报头长度
obj = pc.recv(4)
header_size = struct.unpack('i', obj)[0] # 2接收报头
header_bytes = pc.recv(header_size) # 3解析报头,对于数据的描述
header_json = header_bytes.decode('utf-8')
header_dic = json.loads(header_json)
print(header_dic)
total_size = header_dic['file_size']
file_name = header_dic['filename'] # 4 接受真实的数据
with open('%s/%s' % (download_dir, file_name), 'wb') as f:
recv_size = 0
while recv_size < total_size:
res = pc.recv(1024)
f.write(res)
recv_size += len(res)
print('总大小:%s 已经下载大小:%s' % (total_size, recv_size)) def put(cmds, conn):
filename = cmds[1]
# 3.以读的方式打开,读取文件
# 1制作报头
header_dic = {
'filename': filename,
'md5': 'xxdxx',
'file_size': os.path.getsize(r'%s/%s' % (download_dir, filename))
}
header_json = json.dumps(header_dic)
header_bytes = header_json.encode('utf-8') # 2 发送报头长度
conn.send(struct.pack('i', len(header_bytes))) # 固定长度4 # 3 发报头
conn.send(header_bytes)
# 4发真实数据
send_size = 0
with open('%s/%s' % (download_dir, filename), 'rb') as f:
# conn.send(f.read())
for a in f:
conn.send(a)
send_size += len(a)
print(send_size) def run():
pc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
pc.connect(('127.0.0.1', 10000))
print(pc)
while True:
# 1.发命令
inp = input('>>>:').strip() # get a.text
if not inp:
continue
pc.send(inp.encode('utf-8'))
cmds = inp.split()
if cmds[0] == 'get':
get(pc)
elif cmds[0] == 'put':
put(cmds, pc)
pc.close() if __name__ == '__main__':
run()
python socket文件传输实现的更多相关文章
- 基于序列化技术(Protobuf)的socket文件传输
好像好久都没更博文了,没办法,最近各种倒霉事情,搞到最近真的没什么心情,希望之后能够转运吧. 言归正传,这次我要做的是基于序列化技术的socket文件传输来无聊练一下手. 一.socket文件传输 之 ...
- python 3.7 利用socket文件传输
参考:https://www.cnblogs.com/VseYoung/p/socket_1.html 参考 https://blog.csdn.net/a19990412/article/detai ...
- Java基于Socket文件传输示例(转)
最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加 ...
- Java基于Socket文件传输示例
http://www.blogjava.net/sterning/archive/2007/10/13/152508.html 最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步 ...
- Socket 文件传输
服务端 1.控件:TServerSocket 2.OnClientRead事件处理 procedure TMainForm.ssClientRead(Sender: TObject; Socket: ...
- Linux网络编程:socket文件传输范例
基于TCP流协议的socket网络文件传输Demo: 实现:C语言功能:文件传输(可以传任何格式的文件) /********************************************** ...
- Android连接热点的Socket文件传输
最近把测试丢过来的种种BUG解决后,终于有时间去研究研究Socket通信,再加上以前做的WiFi连接和热点开启,于是有了现在的这篇博文:创建热点发送文件,让另一台手机连接热点接收文件. 效果图: 两台 ...
- Python socket文件上传下载
python网络编程 程序的目录结构 socketDemo ├── client │ ├── cli.py │ └── local_dir │ └── lianxijiangjie.mp4 ...
- [Socket]Socket文件传输
1.Server import java.io.DataInputStream; import java.io.FileOutputStream; import java.io.IOException ...
随机推荐
- 万网上如何将IP和申请的域名绑定
万网上如何将IP和申请的域名绑定 在万网上购买了域名后,怎么将它和指定的IP进行绑定呢?下面简单介绍下 工具/原料 中国万网账号 购买的域名 服务器 方法/步骤 百度万网,找到网站后, ...
- OpenCV的配置
系统配置:win7 64位系统,编译器 vs2013 一.下载OpenCV安装包(版本2.4.13) https://excellmedia.dl.sourceforge.net/project/op ...
- JoinMap
#include <iostream> #include <fstream> using namespace std; #include <opencv2/core/co ...
- XXX 不是当前用户的有效责任,请联系您的系统管理员
EBS中,有时进入一些基于OA Framework 的Web页面时,会出现这种现象: XXX 不是当前用户的有效责任,请联系您的系统管理员 ( or: xxx is not a valid resp ...
- oracle ebs常规小看点
1. 在oracle applications 11i 中如何快速获得上次查询的SQL 语句 方法:我们不必使用SQL Trace 来获得,有一个简单的办法,即:帮助->诊断->检查- ...
- 数据集和JSON相互转换
使用DELPHI原生类实现数据集和JSON相互转换 JSON二要素:数组和对象.对象可以包含数组,数组可以包含对象.无层数限制.OLEVARIANT也类似,OLEVARIANT的一个元素又可以是OL ...
- Postgresql 日志审计
配置log_destination = 'csvlog'logging_collector = off log_directory = 'pg_log'log_connections = onlog_ ...
- asp.net Frameset框架集的嵌套使用
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Frame.aspx.cs& ...
- cesium编程入门(六)添加 3D Tiles,并调整位置,贴地
添加 3D Tiles,并调整位置 3D Tiles 是什么 3DTiles数据集是cesium小组AnalyticlGraphics与2016年3月定义的一种数据集,3DTiles数据集以分块.分级 ...
- k8s 入门系列之介绍篇
•Kubernetes介绍1.背景介绍 云计算飞速发展 - IaaS - PaaS - SaaS Docker技术突飞猛进 - 一次构建,到处运行 - 容器的快速轻量 - 完整的生态环境2.什么是ku ...