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 ...
随机推荐
- Hibernate 基本概念
这一段正在学Hibernate,首先要了解下Hibernate大概的意思,究竟什么是Hibernate,到底它是个什么东西,必须从整体上把握下Hibernate在整个开发过程中所起到的作用,这样对更深 ...
- Chrome Command Line API 参考
- 三)Wiring up jobs using triggers and the SchedulerFactoryBean
示例地址: https://github.com/witaste/quartz.git │ pom.xml │ └─src └─main ├─java │ └─cn │ └─zno │ └─job │ ...
- java并发编程实战:第十一章----性能和可伸缩性
线程的最主要目的是提高程序的运行性能,但性能的提升会导致复杂性的提升,又会导致安全性和活跃性的风险 一.对性能的思考 提升性能意味着用更少的资源做更多地事情.要想通过并发来获得更好的性能,就要更有效地 ...
- Java动态代理(三)——模拟AOP实现
以下案例模拟AOP实现 目录结构 接口PersonService package com.ljq.service; public interface PersonService { public vo ...
- D3.js的基础部分之数组的处理 映射(v3版本)
映射(Map) 映射(Map)是十分常见的一种数据结构,由一系列键(key)和值(value)组成的.每个key对应一个value,根据key可以获取和设定value,也可以根据key来查询val ...
- python面试题之如何计算一个字符串的长度
在我们想计算长度的字符串上调用函数len()即可 >>> len('hhhhhhhhjg') 10 所属网站分类: 面试经典 > python 作者:外星人入侵 链接:http ...
- 原创:MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 2、数据框架 和 功能预览
说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登录 MVC 影视(MvcMovie.cn) 进行查阅.如需转载,请注明出处:http://www.cnblogs.com/Dod ...
- WebApi 插件式构建方案:IOC 容器初始化
body { border: 1px solid #ddd; outline: 1300px solid #fff; margin: 16px auto; } body .markdown-body ...
- 【MVC】视图页引用分部视图(WebForm叫做用户控件)
方法一.不经过控制器.动作方法,直接返回Html @Html.Partial("Head","我可以给分布视图传数据") Head是Views/Shared/H ...