python socket 传输文件
推荐资料
https://www.cnblogs.com/xiaokang01/p/9865724.html
socket传输文件
思路:
# 先将报头转换成字符串(json.dumps), 再将字符串的长度打包
# 发送报头长度,发送报头内容,最后放真是内容
# 报头内容包括文件名,文件信息,报头
# 接收时:先接收4个字节的报头长度,
# 将报头长度解压,得到头部信息的大小,在接收头部信息, 反序列化(json.loads)
# 最后接收真实文件
服务端
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 18-5-21 下午1:59
# @Author : LK
# @File : 文件传输-服务端.py
# @Software: PyCharm from socket import *
import struct
import json
import os tcp_server = socket(AF_INET, SOCK_STREAM)
ip_port = (('127.0.0.1', 8080))
buffsize = 1024 # 端口的重复利用
tcp_server.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)
tcp_server.bind(ip_port)
tcp_server.listen(5)
print('还没有人链接')
while True:
'''链接循环'''
conn, addr = tcp_server.accept() print('链接人的信息:', addr)
while True:
if not conn:
print('客户端链接中断')
break
'''通信循环'''
filemesg = input('请输入要传送的文件名加后缀>>>').strip() filesize_bytes = os.path.getsize(filemesg) # 得到文件的大小,字节
filename = 'new' + filemesg
dirc = {
'filename': filename,
'filesize_bytes': filesize_bytes,
}
head_info = json.dumps(dirc) # 将字典转换成字符串
head_info_len = struct.pack('i', len(head_info)) # 将字符串的长度打包
# 先将报头转换成字符串(json.dumps), 再将字符串的长度打包
# 发送报头长度,发送报头内容,最后放真是内容
# 报头内容包括文件名,文件信息,报头
# 接收时:先接收4个字节的报头长度,
# 将报头长度解压,得到头部信息的大小,在接收头部信息, 反序列化(json.loads)
# 最后接收真实文件
conn.send(head_info_len) # 发送head_info的长度
conn.send(head_info.encode('utf-8')) # 发送真是信息
with open(filemesg, 'rb') as f:
data = f.read()
conn.sendall(data) print('发送成功')
客户端
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 18-5-21 下午1:59
# @Author : LK
# @File : 文件传输_客户端.py
# @Software: PyCharm from socket import *
import struct
import json
import os
import sys
import time
from 进度条 import process_bar tcp_client = socket(AF_INET, SOCK_STREAM)
ip_port = (('127.0.0.1', 8080))
buffsize = 1024
tcp_client.connect_ex(ip_port)
print('等待链接服务端')
while True:
head_struct = tcp_client.recv(4) # 接收报头的长度,
if head_struct:
print('已连接服务端,等待接收数据')
head_len = struct.unpack('i', head_struct)[0] # 解析出报头的字符串大小
data = tcp_client.recv(head_len) # 接收长度为head_len的报头内容的信息 (包含文件大小,文件名的内容) head_dir = json.loads(data.decode('utf-8'))
filesize_b = head_dir['filesize_bytes']
filename = head_dir['filename'] # 接受真的文件内容
recv_len = 0
recv_mesg = b''
old = time.time()
f = open(filename, 'wb')
while recv_len < filesize_b:
percent = recv_len / filesize_b process_bar(percent)
if filesize_b - recv_len > buffsize: recv_mesg = tcp_client.recv(buffsize)
f.write(recv_mesg)
recv_len += len(recv_mesg)
else:
recv_mesg = tcp_client.recv(filesize_b - recv_len)
recv_len += len(recv_mesg)
f.write(recv_mesg) print(recv_len, filesize_b)
now = time.time()
stamp = int(now - old)
print('总共用时%ds' % stamp)
f.close()
进度条
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 18-5-21 下午3:44
# @Author : LK
# @File : 进度条.py
# @Software: PyCharm
import sys
import time
def process_bar(precent, width=50):
use_num = int(precent*width)
space_num = int(width-use_num)
precent = precent*100
# 第一个和最后一个一样梯形显示, 中间两个正确,但是在python2中报错
#
# print('[%s%s]%d%%'%(use_num*'#', space_num*' ',precent))
# print('[%s%s]%d%%'%(use_num*'#', space_num*' ',precent), end='\r')
print('[%s%s]%d%%'%(use_num*'#', space_num*' ',precent),file=sys.stdout,flush=True, end='\r')
# print('[%s%s]%d%%'%(use_num*'#', space_num*' ',precent),file=sys.stdout,flush=True) # for i in range(21):
# precent = i/20
# process_bar(precent)
# time.sleep(0.2)

socket_server 传输文件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 18-5-21 下午8:04
# @Author : LK
# @File : server_socket_文件_服务端.py
# @Software: PyCharm import socketserver
import struct import os
import json
import struct def sendRealFile(conn, filename):
'''发送真是文件'''
with open(filename, 'rb')as f:
conn.sendall(f.read()) print('发送成功') def operafile(filename):
'''对报头进行打包'''
filesize_bytes = os.path.getsize(filename)
head_dir = {
'filename': 'new' + filename,
'filesize_bytes': filesize_bytes,
}
head_info = json.dumps(head_dir)
head_info_len = struct.pack('i', len(head_info))
return head_info_len, head_info class MyServer(socketserver.BaseRequestHandler):
buffsize = 1024
def handle(self):
# self.request
print('连接人的信息')
print('conn是', self.request) # conn
print('addr是', self.client_address) # addr while True:
'''收发消息'''
filename = input('请输入要发送的文件名加上后缀>>>').strip()
# 判断文件是否存在 head_info_len, head_info = operafile(filename)
self.request.send(head_info_len) # 这里是4个字节
self.request.send(head_info.encode('utf-8')) # 发送报头的内容
sendRealFile(self.request, filename) if __name__ == '__main__':
# pass
print('还没有人连接')
s = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyServer) # 多线程
# 服务器一直开着
s.serve_forever()
socket_server传输文件服务端
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 18-5-21 下午8:32
# @Author : LK
# @File : server_socket_文件客户端.py
# @Software: PyCharm
from socket import *
import os
import sys
import json
import struct tcp_client = socket(AF_INET, SOCK_STREAM)
ip_port = (('127.0.0.1', 8080))
buffsize = 1024
tcp_client.connect_ex(ip_port)
print('等待服务端发送信息') def recv_file(head_dir, tcp_client):
filename = head_dir['filename']
filesize_b = head_dir['filesize_bytes']
recv_len = 0
recv_mesg = b''
f = open(filename, 'wb')
while recv_len < filesize_b:
if filesize_b - recv_len > buffsize:
recv_mesg = tcp_client.recv(buffsize)
recv_len += len(recv_mesg)
f.write(recv_mesg)
else:
recv_mesg = tcp_client.recv(filesize_b - recv_len)
recv_len += len(recv_mesg)
f.write(recv_mesg) f.close()
print('文件传输完成') while True:
'''收发循环'''
struct_len = tcp_client.recv(4) # 接受报头的长度
struct_info_len = struct.unpack('i',struct_len)[0] # 解析得到报头信息的长度
head_info = tcp_client.recv(struct_info_len) # 接受报头的内容
head_dir = json.loads(head_info.decode('utf-8')) # 将报头的内容反序列化
# # 文件信息
# filename = head_dir['filename']
# filesize = head_dir['filesize_bytes']
recv_file(head_dir, tcp_client) # 接受文件
socket_server传输文件客户端
python socket 传输文件的更多相关文章
- Python Socket传输文件
发送端可以不停的发送新文件,接收端可以不停的接收新文件. 例如:发送端输入:e:\visio.rar,接收端会默认保存为 e:\new_visio.rar,支持多并发,具体实现如下: 接收端: 方法一 ...
- Java使用Socket传输文件遇到的问题(转)
1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决 ...
- Java使用Socket传输文件遇到的问题
1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决 ...
- 采用socket传输文件
采用socket传输文件 客户端输入文件的地址,服务端判断文件存在,就将文件传输到客户端 package com.fly.socket; import java.io.BufferedInputStr ...
- python socket实现文件传输(防粘包)
1.文件传输的要点: 采用iterator(迭代器对象)迭代读取,提高读取以及存取效率: 通过for line in file_handles逐行conn.send(): 2.socket粘包问题: ...
- Java 学习笔记 网络编程 使用Socket传输文件 CS模式
Socket的简单认识 Socket是一种面向连接的通信协议,Socket应用程序是一种C/S(Client端/Server端)结构的应用程序 Socket是两台机器间通信的端点. Socket是连接 ...
- Python Socket实现文件上传(TCP协议)
在TCP协议下通过socket模块实现文件上传 #!/usr/bin/env python # -*- coding: utf-8 -*- # desc: tcp_server_file_upload ...
- IOS — 关于Socket传输文件需要自定义延时或者包大小的情况
1. 首先导入头文件 #include <stdio.h> #include <errno.h> #include <string.h> #include < ...
- python ftp 传输文件
# -*- coding: utf-8 -*- # 本地bytes 数据上报服务器同时创建文件from ftplib import FTP import time, _io from constant ...
随机推荐
- 微信小程序特性总结
一. 小程序不是运行在浏览器中, 所以没有BOM和DOM对象 即console.log(window)和console.log(document)是获取不到任何内容的 二. 小程序特有的额外js成员( ...
- .Net Core 最简洁的约定式依赖注入
.Net Core 最简洁的约定式依赖注入 github:https://github.com/280780363/guc/tree/master/src/Guc.Kernel/Dependency ...
- 一步步从零开始用 webpack 搭建一个大型项目
开篇 很多人都或多或少使用过 webpack,但是很少有人能够系统的学习 webpack 配置,遇到错误的时候就会一脸懵,不知道从哪查起?性能优化时也不知道能做什么,网上的优化教程是不是符合自己的项目 ...
- Js apply方法与call方法详解 附ES6新写法
我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家 ...
- SpringBoot集成Spring Security(1)——入门程序
因为项目需要,第一次接触 Spring Security,早就听闻 Spring Security 功能强大但上手困难,学习了几天出入门道,特整理这篇文章希望能让后来者少踩一点坑(本文附带实例程序,请 ...
- 第21课 shared_ptr共享型智能指针
一. shared_ptr的基本用法 (一)与unique_ptr的比较 比较 shared_ptr unique_ptr 备注 初始化 ①shared_ptr<T> sp; sp.res ...
- Phaser铁人三项
/** * 模拟铁人三项 */ public class PhaserTest { private static Random random = new Random(System.currentTi ...
- Java并发之原子性,可见性,有序性
原子性 原子性指的是一个或者多个操作在 CPU 执行的过程中不被中断的特性 在多线程情况下,线程会被操作系统调度进行任务切换,占有CPU时间片段的就执行,否则就阻塞 java中对基础类型的变量赋值是 ...
- springboot: xercesImpl.jar和xml-apis.jar (系统找不到指定的文件)
springboot内置的tomcat为8.5.23, tomcat在8.5.2 中 修改了加载jar的方式,8.5.2 版本会解析jar中MANIFEST.MF文件,当该文件包含class-path ...
- 【学习笔记】薛定谔的喵咪Cat—球盒问题(全详解)
[学习笔记]薛定谔的喵咪Cat-球盒问题(全详解) [题目描述] 当一个猫在盒子里时,因为放射物的状态我们不知道,所以猫的状态我们也不知道,这就所谓猫的生死纠缠态,也是所谓的薛定谔的猫. 当我们做需要 ...