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连接mysql驱动有关问题(windows版本)
Apr 23 Python
Python中使用asyncio 封装文件读写
Sep 11 Python
Python 中Pickle库的使用详解
Feb 24 Python
使用python爬虫获取黄金价格的核心代码
Jun 13 Python
对Tensorflow中权值和feature map的可视化详解
Jun 14 Python
详解python多线程之间的同步(一)
Apr 03 Python
Python 占位符的使用方法详解
Jul 10 Python
python同义词替换的实现(jieba分词)
Jan 21 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
Mar 12 Python
Python Pandas list列表数据列拆分成多行的方法实现
Dec 14 Python
只用40行Python代码就能写出pdf转word小工具
May 31 Python
Jupyter Notebook内使用argparse报错的解决方案
Jun 03 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模板之Phpbean的目录结构
2008/01/10 PHP
PHP中copy on write写时复制机制介绍
2014/05/13 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
javascript正则表达式中的replace方法详解
2015/04/20 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
jQuery事件详解
2017/02/23 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
在Python的Django框架中编写编译函数
2015/07/20 Python
python求质数的3种方法
2018/09/28 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
学习python的前途 python挣钱
2019/02/27 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
基于python实现删除指定文件类型
2020/07/21 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
HTML5网页录音和上传到服务器支持PC、Android,支持IOS微信功能
2019/04/26 HTML / CSS
通息工程毕业生自荐信
2013/10/16 职场文书
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
聚美优品的广告词
2014/03/14 职场文书
十八大演讲稿
2014/05/22 职场文书
论文诚信承诺书
2014/05/23 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
2015年国庆晚会主持词
2015/07/01 职场文书
导游词之南京栖霞山
2019/10/18 职场文书