简单版

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文件传输实现的更多相关文章

  1. 基于序列化技术(Protobuf)的socket文件传输

    好像好久都没更博文了,没办法,最近各种倒霉事情,搞到最近真的没什么心情,希望之后能够转运吧. 言归正传,这次我要做的是基于序列化技术的socket文件传输来无聊练一下手. 一.socket文件传输 之 ...

  2. python 3.7 利用socket文件传输

    参考:https://www.cnblogs.com/VseYoung/p/socket_1.html 参考 https://blog.csdn.net/a19990412/article/detai ...

  3. Java基于Socket文件传输示例(转)

    最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加 ...

  4. Java基于Socket文件传输示例

    http://www.blogjava.net/sterning/archive/2007/10/13/152508.html 最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步 ...

  5. Socket 文件传输

    服务端 1.控件:TServerSocket 2.OnClientRead事件处理 procedure TMainForm.ssClientRead(Sender: TObject; Socket: ...

  6. Linux网络编程:socket文件传输范例

    基于TCP流协议的socket网络文件传输Demo: 实现:C语言功能:文件传输(可以传任何格式的文件) /********************************************** ...

  7. Android连接热点的Socket文件传输

    最近把测试丢过来的种种BUG解决后,终于有时间去研究研究Socket通信,再加上以前做的WiFi连接和热点开启,于是有了现在的这篇博文:创建热点发送文件,让另一台手机连接热点接收文件. 效果图: 两台 ...

  8. Python socket文件上传下载

    python网络编程 程序的目录结构 socketDemo ├── client │   ├── cli.py │   └── local_dir │   └── lianxijiangjie.mp4 ...

  9. [Socket]Socket文件传输

    1.Server import java.io.DataInputStream; import java.io.FileOutputStream; import java.io.IOException ...

随机推荐

  1. [分享]PY的Boost自动编译程序 1.1 根据环境自动编译

    Python写的Boost自动编译程序 1.1 改进: 根据自己的环境筛选出已安装环境,并列出 环境提供选择. 支持X64位的自动参数编译. 可以选择编译的参数,其他版本持续改进中 自动编译自动安装到 ...

  2. LAMP环境配置踩坑2外网无法访问

    理论上我们配置LAMP环境的时候都会对httpd.config进行更改 vi /etc/httpd/conf/httpd.conf 把override node改成override all 并且开启8 ...

  3. 整理Javascript基础数据和引用数据复制值的问题

    Javascript数据分为两大类:1.基础类型(原始类型数据) 2.引用类型.他们的存储方式是不同的 基础类型的数据存储是保存在栈内存中的: 例如: var a=1; var b=a; var a= ...

  4. swift学习之UIButton

    // //  ViewController.swift //  button // //  Created by su on 15/12/7. //  Copyright © 2015年 tian. ...

  5. 初级 Web 开发人员的 Tomcat

    介绍使用 Tomcat 对 JavaServer Pages (JSP).servlet 和 Web 服务进行编程,Tomcat 是来自 Apache Foundation 的开源应用服务器.本教程引 ...

  6. ORACLE ERP 的前世今生

    一个伟大的公司必有一个伟大的产品.如果说数据库是ORACLE在上世纪最后二十年赖以起家并奠定江湖地位的旗舰产品,那么,企业应用产品(或曰ERP)则毫无疑问是ORACLE在本世纪初的这近十年,征战疆场. ...

  7. 利用ROW_NUMBER中的partition by 删除重复Key的数据

    With temp As ( Select ROW_NUMBER() over(partition by LogisticsPlan order by createon) rowID,ID from ...

  8. .Net工程师面试笔试宝典

    .Net工程师面试笔试宝典 传智播客.Net培训班内部资料 http://net.itcast.cn 这套面试笔试宝典是传智播客在多年的教学和学生就业指导过程中积累下来的宝贵资料,大部分来自于学员从面 ...

  9. brew安装指定版本boost

    brew 如何安装指定版本的boost brew uninstall boost brew install boost@1.57 brew link boost@1.57 --force --over ...

  10. iOS 的各种识别码

    在iOS系统中,获取设备唯一标识的方法有很多: 1. x UDID (Unique Device Identifier,已过期) 2. x OPEN UDID (已过期) 3. 广告标示符(IDFA- ...