推荐资料

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

  1. Python Socket传输文件

    发送端可以不停的发送新文件,接收端可以不停的接收新文件. 例如:发送端输入:e:\visio.rar,接收端会默认保存为 e:\new_visio.rar,支持多并发,具体实现如下: 接收端: 方法一 ...

  2. Java使用Socket传输文件遇到的问题(转)

    1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决 ...

  3. Java使用Socket传输文件遇到的问题

    1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决 ...

  4. 采用socket传输文件

    采用socket传输文件 客户端输入文件的地址,服务端判断文件存在,就将文件传输到客户端 package com.fly.socket; import java.io.BufferedInputStr ...

  5. python socket实现文件传输(防粘包)

    1.文件传输的要点: 采用iterator(迭代器对象)迭代读取,提高读取以及存取效率: 通过for line in file_handles逐行conn.send(): 2.socket粘包问题: ...

  6. Java 学习笔记 网络编程 使用Socket传输文件 CS模式

    Socket的简单认识 Socket是一种面向连接的通信协议,Socket应用程序是一种C/S(Client端/Server端)结构的应用程序 Socket是两台机器间通信的端点. Socket是连接 ...

  7. Python Socket实现文件上传(TCP协议)

    在TCP协议下通过socket模块实现文件上传 #!/usr/bin/env python # -*- coding: utf-8 -*- # desc: tcp_server_file_upload ...

  8. IOS — 关于Socket传输文件需要自定义延时或者包大小的情况

    1. 首先导入头文件 #include <stdio.h> #include <errno.h> #include <string.h> #include < ...

  9. python ftp 传输文件

    # -*- coding: utf-8 -*- # 本地bytes 数据上报服务器同时创建文件from ftplib import FTP import time, _io from constant ...

随机推荐

  1. 牛客CSP-S提高组赛前集训营1———2019.10.29 18:30 至 22:00

    期望得分:100+0+10 实际得分:40+0+0 考炸了... T1:题目链接 究竟为什么会这样,,, 仔细研读我的丑代码 发现... 枯辽.... #include<cstdio> # ...

  2. Appium入门指南 - 环境搭建和Case编写

    本文档将详细介绍如何搭建 Appium 的运行环境,以及如何编写一个简单的 UI 自动化测试用例.其中,也会穿插讲解一些 Appium 的基本知识.关于 Appium 的更多信息,大家可以查看官方文档 ...

  3. [LeetCode] 658. Find K Closest Elements 寻找K个最近元素

    Given a sorted array, two integers k and x, find the k closest elements to x in the array. The resul ...

  4. [LeetCode] 159. Longest Substring with At Most Two Distinct Characters 最多有两个不同字符的最长子串

    Given a string s , find the length of the longest substring t  that contains at most 2 distinct char ...

  5. 可以在shell脚本中使用哪些类型的变量?

    在shell脚本,我们可以使用两种类型的变量: 系统定义变量 用户定义变量 系统变量是由系统系统自己创建的.这些变量通常由大写字母组成,可以通过“set”命令查看. 用户变量由系统用户来生成和定义,变 ...

  6. Linux查看进程和已知端口是否启动

    如查看activeMQ的61616这个端口是否启动,以及直接查看activeMQ进程是否启动,可以通过如下命令进行查看 其中netstat命令必须知道端口,如果能查出就证明已启动,如果查出没有结果则表 ...

  7. Ubuntu安装完搜狗后,更改ctrl+shift切换输入法

    1.打开搜狗设置 2.更改Scroll between Input Method即可,我设置成了 ALT_SUPER(Win键)

  8. css 在一定区域内滚动显示,不修改父级样式

    做项目时,会遇到一些零碎的技术点.记录下来以防忘记 需求:图中圈中的部门是滚动的.不修改父级样式 代码: <div class="right-text-bottom"> ...

  9. 重启服务器后Docker容器暴露的端口外网突然访问不了!!

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  10. mnist数据集探究

    一.mnist的属性和方法 为了方便我只检查了后20个属性和方法 from tensorflow.examples.tutorials.mnist import input_data mnist = ...