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 xlrd读取excel日期类型的2种方法
Apr 28 Python
在Python中使用SQLite的简单教程
Apr 29 Python
Python 迭代器工具包【推荐】
May 06 Python
Python实现的根据IP地址计算子网掩码位数功能示例
May 23 Python
django表单实现下拉框的示例讲解
May 29 Python
[机器视觉]使用python自动识别验证码详解
May 16 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
Feb 05 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
Jun 02 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
基于Python采集爬取微信公众号历史数据
Nov 27 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
Jan 27 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 $_FILES函数详解
2011/03/09 PHP
Apache中php.ini的设置方法
2013/02/28 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
2017/06/07 PHP
PDO::_construct讲解
2019/01/27 PHP
解决表单中第一个非隐藏的元素获得焦点的一个方案
2009/10/26 Javascript
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
js判断登陆用户名及密码是否为空的简单实例
2016/05/16 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
2018/09/04 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
js面向对象之实现淘宝放大镜
2020/01/15 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
python基于socket实现网络广播的方法
2015/04/29 Python
Python字符串匹配算法KMP实例
2015/07/18 Python
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
Python字典对象实现原理详解
2019/07/01 Python
Python argparse模块使用方法解析
2020/02/20 Python
Python利用for循环打印星号三角形的案例
2020/04/12 Python
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
单位办理社保介绍信
2014/01/10 职场文书
军人离婚协议书样本
2014/10/21 职场文书
在人间读书笔记
2015/06/30 职场文书
校园开放日新闻稿
2015/07/17 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电
win11无法添加打印机怎么办? 提示windows无法打开添加打印机的解决办法
2022/04/05 数码科技
聊聊CSS粘性定位sticky案例解析
2022/06/01 HTML / CSS