python 通过 socket 发送文件的实例代码


Posted in Python onAugust 14, 2018

目录结构:

python 通过 socket 发送文件的实例代码

client:

#!/usr/bin/env python
# -*-coding:utf-8 -*-
import socket, struct, json
download_dir = r'D:\Python\python_learning\gd\code\part3\02网络编程\文件传输\client\download'
gd_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
gd_client.connect(('127.0.0.1',8123))

while True:

#1、发命令
  cmd=input('>>: ').strip() #get a.txt
  if not cmd:continue
  gd_client.send(cmd.encode('utf-8'))
  #2、以写的方式打开一个新文件,接收服务端发来的文件的内容写入客户的新文件
  #第一步:先收报头的长度
  obj=gd_client.recv(4)
  header_size=struct.unpack('i',obj)[0]
  # 第二步:再收报头
  header_bytes = gd_client.recv(header_size)
  # 第三步:从报头中解析出对真实数据的描述信息
  header_json = header_bytes.decode('utf-8')
  header_dic = json.loads(header_json)
  '''
  header_dic = {
    'filename': filename, # 1.txt
    'file_size': os.path.getsize(r'%s\%s' % (share_dir, filename)) # 路径/1.txt
  }  
  '''
  total_size = header_dic['file_size']
  file_name = header_dic['filename']
  # 第四步:接收真实的数据
  with open(r'%s\%s'%(download_dir, file_name),'wb') as f:
    recv_size = 0
    while recv_size < total_size:
      line = gd_client.recv(1024)
      f.write(line)
      recv_size += len(line)
      print('总大小:%s  已下载大小:%s' % (total_size, recv_size))
gd_client.close()​

server:

#!/usr/bin/env python
# -*-coding:utf-8 -*-
import socket
import subprocess
import struct
import json
import os
share_dir = r'D:\Python\python_learning\gd\code\part3\02网络编程\文件传输\server\share'
gd_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
gd_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
gd_server.bind(('127.0.0.1', 8123)) # 0-65535: 0-1024给操作系统使用
gd_server.listen(5)
while True:
  conn, client_addr = gd_server.accept()
  while True: # 通信循环
    try:
      # 1、收命令
      res = conn.recv(8096) # b'get 1.txt'
      if not res: break # 适用于linux操作系统
      # 2、解析命令,提取相应命令参数
      cmds = res.decode('utf-8').split() # ['get','1.txt']
      filename = cmds[1]
      # 3、以读的方式打开文件,读取文件内容发送给客户端
      # 第一步:制作固定长度的报头
      header_dic = {
        'filename': filename, # 1.txt
        'file_size':os.path.getsize(r'%s\%s'%(share_dir, filename)) # 路径/1.txt
      }
      header_json = json.dumps(header_dic)
      header_bytes = header_json.encode('utf-8')
      # 第二步:先发送报头的长度
      conn.send(struct.pack('i',len(header_bytes)))
      # 第三步:再发报头
      conn.send(header_bytes)
      # 第四步:再发送真实的数据
      with open('%s/%s'%(share_dir, filename),'rb') as f:
        for line in f:
          conn.send(line)
    except ConnectionResetError: # 适用于windows操作系统
      break
  conn.close()
gd_server.close()​

命令输入: get 1.txt ,然后即可将 server 端的 share文件内的 1.txt 文件 发送到 client 端的 download文件夹下

图片、视频、文字都可以发送,因为传送的是 二进制文件

原理是:server 端以读的形式打开文件,client端以写 的方式打开文件,然后client端把 一条一条的二进制写入文件后保存即可。

总结

以上所述是小编给大家介绍的python 通过 socket 发送文件的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python读文件逐行处理的示例代码分享
Dec 27 Python
Python中实现字符串类型与字典类型相互转换的方法
Aug 18 Python
Python简单获取自身外网IP的方法
Sep 18 Python
使用Python多线程爬虫爬取电影天堂资源
Sep 23 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
Jun 19 Python
python 用opencv调用训练好的模型进行识别的方法
Dec 07 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
Sep 16 Python
Python chardet库识别编码原理解析
Feb 18 Python
最小二乘法及其python实现详解
Feb 24 Python
python读写数据读写csv文件(pandas用法)
Dec 14 Python
python中HTMLParser模块知识点总结
Jan 25 Python
Python 打印中文字符的三种方法
Aug 14 #Python
django如何连接已存在数据的数据库
Aug 14 #Python
Python requests库用法实例详解
Aug 14 #Python
Python基于SMTP协议实现发送邮件功能详解
Aug 14 #Python
selenium+python实现1688网站验证码图片的截取功能
Aug 14 #Python
django+xadmin+djcelery实现后台管理定时任务
Aug 14 #Python
Python延时操作实现方法示例
Aug 14 #Python
You might like
php中截取中文字符串的代码小结
2011/07/17 PHP
php变量作用域的深入解析
2013/06/03 PHP
PHP安装memcached扩展笔记
2015/05/28 PHP
ThinkPHP3.2.3实现分页的方法详解
2016/06/03 PHP
php结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
2015/11/03 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
2016/05/26 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
JavaScript canvas绘制渐变颜色的矩形
2020/02/18 Javascript
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
python打包压缩、读取指定目录下的指定类型文件
2018/04/12 Python
python破解zip加密文件的方法
2018/05/31 Python
Python面向对象之类和对象属性的增删改查操作示例
2018/12/14 Python
python 回溯法模板详解
2020/02/26 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
如何利用python生成MD5并去重
2020/12/07 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
某IT外企面试题-二分法求方程!看看大家的C++功底
2015/07/04 面试题
什么是索引指示器
2012/08/20 面试题
办公室综合文员岗位职责范本
2014/02/13 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书
golang中字符串MD5生成方式总结
2021/07/04 Golang
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python