参考:https://www.cnblogs.com/VseYoung/p/socket_1.html

参考 https://blog.csdn.net/a19990412/article/details/80919703

参考:https://www.cnblogs.com/xiaokang01/p/9069048.html

方法一:

接收

fileinfo_size=struct.calcsize('128sl')
buf = conn.recv(fileinfo_size)
if buf:
filename, filesize = struct.unpack('128sl', buf)
fn = filename.decode().strip('\00') #Python strip() 方法用于删除字符串头部和尾部指定的字符,默认字符为所有空字符,包括空格、换行(\n)、制表符(\t)等。
new_filename = os.path.join('./', 'new_' + fn)
print ('file new name is {0}, filesize is {1}'.format(new_filename,
filesize)) recvd_size = 0 # 定义已接收文件的大小
fp = open(new_filename, 'wb')
print ('start receiving...') while not recvd_size == filesize:
if filesize - recvd_size > 1024:
data = conn.recv(1024)
recvd_size += len(data)
else:
data = conn.recv(filesize - recvd_size)
recvd_size = filesize
fp.write(data)
fp.close()
print ('end receive...')

发送:

get_screen(in_pathscr)
filepath = in_pathscr
if os.path.isfile(filepath):
fileinfo_size = struct.calcsize('128sl')
fhead = struct.pack('128sl', bytes(os.path.basename(filepath).encode()),os.stat(filepath).st_size) #encode很重要
s.send(fhead)
print ('client filepath: {0}'.format(filepath)) #
fp = open(filepath, 'rb') # rb 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
while 1:
data = fp.read(1024)
if not data:
print ('{0} file send over...'.format(filepath))
break
s.send(data)

方法二

客户端

#!/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 下午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('发送成功')

python 3.7 利用socket文件传输的更多相关文章

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

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

  2. python socket文件传输实现

    简单版 server(服务端) import socket import subprocess import struct import json import os share_dir = r'E: ...

  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. [Socket]Socket文件传输

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

  9. 忘带U盘了??别急!一行python代码即可搞定文件传输

    近日发现了python一个很有趣的功能,今天在这里给大伙儿做一下分享 需求前提 1.想要拷贝电脑的文件到另一台电脑但是又没有U盘2.手机上想获取到存储在电脑的文件3.忘带U盘- 您也太丢三落四了吧,但 ...

随机推荐

  1. oracle dg库因为standby_file_management参数导致应用停止

    DG库的standby_file_management=manual,主库添加文件的时候,备库无法自动创建对应的文件而报错 File #154 added to control file as 'UN ...

  2. jQuery库 之 jquery slimscroll插件使用

    1.引入jQuery插件 <script type="text/javascript" src="jquery.min.js"></scrip ...

  3. [Usaco2007 Dec]Building Roads 修建道路

    题目描述 Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场).有些农场 ...

  4. 免费稳定图床最佳实践:PicGo+GitHub+jsDeliver 极简教程

    一.下载 PicGo PicGo 是啥?顾名思义,它是一个快速上传图片并获取 图片 URL 链接的工具. 目前支持七牛.腾讯云.阿里云和 GitHub 等图床.该工具代码已在 GitHub 开源,读者 ...

  5. JavaScript中的异步函数

    JavaScript中的异步函数 ES8 的 async/await 旨在解决利用异步结构组织代码的问题.为此, ECMAScript 对函数进行了扩展,为其增加了两个新关键字: async 和 aw ...

  6. linux--关于JVM CPU资源占用过高的问题排查

    一.背景: 先执行一个java程序里面开了两个线程分别都在while循环做打印操作. # java -cp ./test-threads.jar com.spiro.Main 二.现象: 通过top命 ...

  7. Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 开源了

    开源的来了,懒人程序员的福音,.NET 生态闭环太缺开源精神了, 拥抱开源! 前言: 本人不是不喜欢现有ORM的轮子,而是发现现有的ORM 的都不太符合开发人员的一些习惯.现有的ORM 要么功能太冗余 ...

  8. GRASP职责分配模式

    https://mp.weixin.qq.com/s/IaxAnWfVqe3mM0bHFVV5Gg 软件开发必修课:你该知道的GRASP职责分配模式 原创 悟真 阿里技术 今天 收录于话题 #设计模式 ...

  9. java定时任务之Qutaz

    前不久一直在学习Qztaz,干好写了一个案例分享一下给大家,希望大家可以用得到. 那么现在开始吧, 一:什么事Qutaz? Quartz是OpenSymphony开源组织在Job scheduling ...

  10. SSH框架搭建详细步骤整理

    学习Java面前有两座山,一座山叫SSM,一座山叫SSH,跨越了这两座山之后才能感受到这个语言的魅力所在,SSM框架的搭建详细在之前博客已经涉及了,今天来整理SSH框架详细步骤: 生有涯 而 学无涯 ...