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 ...
随机推荐
- eclipse 在线安装 properties 插件
help - install new software - work with site http://propedit.sourceforge.jp/eclipse/updates/ 要耐心等待
- line-height:150% 和 line-height:1.5
line-height属性的细节与大多数CSS属性不同,line-height支持属性值设置为无单位的数字.有无单位在子元素继承属性时有微妙的不同. 有单位(包括百分比)与无单位之间的区别有单位时,子 ...
- Python之模块和包学习
模块简介 python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题.模块我们就可以理解为lib库,如果需要使用某个模块中的函数或对象 ...
- [label][JavaScript][The Defined Guide of JavaScript] 变量的作用域
变量的作用域 一个变量的作用域(scope)是程序中定义这个变量的区域. 全局(global)变量的作用域(scope)是全局性的,即在JavaScript代码中,它处处都有定义. 而在函数之内 ...
- ORACLE PATCH 版本的查询 PL/SQL
--ORACLE PATCH 版本的查询 PL/SQL SELECT DD.PATCH_NAME, PP.CREATION_DATE, PP.DRIVER_FILE_NAM ...
- 咏南中间件增加HTTPS.SYS支持
咏南中间件增加HTTPS.SYS支持 老客户可免费升级. HTTPS.SYS可以开发强大而稳定的REST SERVER. 微软在Windows Vista (server 2008) 以后使用http ...
- typescript 自动编译 生成js文件
项目文件 <?xml version="1.0" encoding="utf-8"?><Project ToolsVersion=" ...
- PostMan工具使用之基础篇
PostMan工具使用之基础篇 一.什么是PostMan Postman一款非常流行的API调试工具.(其他测试工具 Jmeter.soapUI) 二.下载及安装: 1.下载: 下载地址:https: ...
- spring的父子上下文容器及配置
本文由作者张远道授权网易云社区发布. spring父子容器 spring总的上下文容器有父子之分.父容器和子容器.父容器对子容器可见,子容器对父容器不可见. 对于传统的spring mvc来说,spr ...
- PXE+Kickstart无人值守安装系统re
PXE(Preboot Excute Environment)预启动执行环境,可以让计算机通过网络启动系统,主要用于无人值守安装系统中引导客户端主机安装Linux操作系统. 由于之前有过使用cobbl ...