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之禅》中对于Python编程过程中的一些建议
Apr 03 Python
Python随机生成带特殊字符的密码
Mar 02 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 Python
Python语言描述KNN算法与Kd树
Dec 13 Python
python邮件发送smtplib使用详解
Jun 16 Python
Python中pip更新和三方插件安装说明
Jul 08 Python
Flask框架配置与调试操作示例
Jul 23 Python
python的pygal模块绘制反正切函数图像方法
Jul 16 Python
nginx搭建基于python的web环境的实现步骤
Jan 03 Python
Python实现自动访问网页的例子
Feb 21 Python
Python如何获取文件指定行的内容
May 27 Python
Python中生成ndarray实例讲解
Feb 22 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操作Access类(PHP+ODBC+Access)
2007/01/02 PHP
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
某人初学javascript的时候写的学习笔记
2010/12/30 Javascript
jQuery 名称冲突的解决方法
2011/04/08 Javascript
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
javascript常用经典算法详解
2017/01/11 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
python GUI图形化编程wxpython的使用
2019/07/19 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
2020/04/26 Python
浅谈Python中的模块
2020/06/10 Python
python3跳出一个循环的实例操作
2020/08/18 Python
捷克玩具商店:Bambule
2019/02/23 全球购物
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
大学生活学习的自我评价
2013/12/03 职场文书
十八届三中全会学习方案
2014/02/16 职场文书
2014年车间工作总结
2014/11/21 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电