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 ...
随机推荐
- Taro/微信小程序解析XML
npm i xmldom PS: https://www.npmjs.com/package/xmldom https://blog.csdn.net/caojie1008/article/detai ...
- JAVA基础概念(一)
一.JAVA标识符 标识符就是用于给 Java 程序中变量.类.方法等命名的符号.如图标黄部分: 使用标识符时,需要遵守几条规则: 1. 标识符可以由字母.数字.下划线(_).美元符($)组成,但不 ...
- streamsets 源码构建
依赖构建工具 git 1.9+ oracle jdk 8 docker 1.10+ maven 3.3.9+ nodejs npm grunt-cli md5sum 预备构建任务 data col ...
- NOI2016优秀的拆分
一种想法是枚举分割位置, 然后考虑前面部分有多少种可行的AA拆分方式, 后面部分有多少种可行的BB拆分方式, 然后乘法原理即可 那么问题是如何快速求出合法方案 解法是首先枚举长度len, 然后将序列分 ...
- 【PE512】Sums of totients of powers(欧拉函数)
点此看题面 大致题意: 求\(\sum_{n=1}^{5*10^8}((\sum_{i=1}^n\phi(n^i))(mod\ n+1))\). 大力推式子 单独考虑\((\sum_{i=1}^n\p ...
- TypeWriting
头文件getputch.h /* * getputch.c */ /* 用于getch/putch的通用头文件"getputch.h" */ #ifndef __GETPUTCH ...
- java if 条件语句
import java.util.Scanner; public class Sample { public static void main(String[] args) { int num; Sc ...
- GreenPlum 大数据平台--segment 失效问题排查
01,segment 检查一: 在master节点上检查失效的segment 正常情况下: :::: gpstate:greenplum01:gpadmin-[INFO]:-Starting gpst ...
- OAuth2.0 自我领悟
grant_type 授权模式 authorization_code 标准的Server授权模式,授权码模式 password 基于用户密码的授权模式,用户密码模式 client_credential ...
- Vue.js 源码分析(十) 基础篇 ref属性详解
ref 被用来给元素或子组件注册引用信息.引用信息将会注册在父组件的 $refs 对象上.如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素:如果用在子组件上,引用就指向组件实例,例如: ...