简单版

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. SpringMvc 全局异常处理器定义,友好的返回后端错误信息

    import com.google.common.collect.Maps; import org.apache.log4j.Logger; import org.springframework.be ...

  2. Google AdWords 广告排名首选项

    排名首选项目标:了解 AdWords 广告客户可怎样为其广告设置排名首选项. 排名首选项简介 通过排名首选项,用户可以告诉 Google 他们希望其广告在给定网页上的所有 AdWords 广告中所处的 ...

  3. .net 分布式架构之分布式锁实现(转)

    分布式锁是控制分布式系统之间同步访问共享资源的一种方式.在分布式系统中,常常需要协调他们的动作.如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防 ...

  4. awk基础01-基本用法

    什么是awk     awk 是一门解释型的编程语言,支持条件判断,数组.循环等功能.可用于文本处理.输出格式化的文本信息.执行数学运算.字符串等操作.     awk在处理文件时按行进行逐行处理,即 ...

  5. ADO接口之_RecordsetPtr

    转自:http://hi.baidu.com/%CE%D2%B6%CF%C1%CB%CB%BC%C4%EE/blog/item/e057c526c6af6c29c995596e.html _Recor ...

  6. Android-自定义联系人快速索引

    效果图: 布局去指定 view.custom.shangguigucustomview.MyCustomIndexView 自定义View对象 <!-- 自定义联系人快速索引 --> &l ...

  7. 搭建自己的 Docker 私有仓库服务

    关于 Docker 的介绍这里就省了,Docker 在其相关领域的火爆程度不亚于今年汽车行业里的特斯拉,docCloud 甚至把公司名都改成了 Docker, Inc. 好东西总是传播很快,我们现在已 ...

  8. Angular之constructor和ngOnInit差异及适用场景

    constructor会在类生成实例时调用,Angular无法控制constructor,constructor中应该只进行依赖注入而不是进行真正的业务操作 ngOnInit属于Angular生命周期 ...

  9. Unity&C# SingerMonoManager泛型单例

    管理各种管理器 ///为什么需要单例 ///单例模式核心在于对于某个单例类,在系统中同时只存在唯一一个实例,并且该实例容易被外界所访问: ///避免创建过多的对象,意味着在内存中,只存在一个实例,减少 ...

  10. sqlcmd 执行SQL语句或没有足够的内存来执行脚本

    win+r命令提示框里面输入cmd sqlcmd -S . -U username -P password -d database -i url -S 数据库地址 -U 登录名称 -P 密码 -d 数 ...