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图像处理之镜像实现方法
May 30 Python
python fabric实现远程部署
Jan 05 Python
Python 稀疏矩阵-sparse 存储和转换
May 27 Python
Python决策树和随机森林算法实例详解
Jan 30 Python
mac安装pytorch及系统的numpy更新方法
Jul 26 Python
python远程邮件控制电脑升级版
May 23 Python
python try except返回异常的信息字符串代码实例
Aug 15 Python
python多线程扫描端口(线程池)
Sep 04 Python
python构建指数平滑预测模型示例
Nov 21 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
Jun 17 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
Jan 15 Python
Python OpenCV 彩色与灰度图像的转换实现
Jun 05 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
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
2017/12/05 Javascript
基于javascript的拖拽类封装详解
2019/04/19 Javascript
详细介绍Python语言中的按位运算符
2013/11/26 Python
pycharm 使用心得(三)Hello world!
2014/06/05 Python
用Python进行基础的函数式编程的教程
2015/03/31 Python
Python抓取百度查询结果的方法
2015/07/08 Python
Python matplotlib绘图可视化知识点整理(小结)
2018/03/16 Python
利用python生成照片墙的示例代码
2020/04/09 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
python 实现Requests发送带cookies的请求
2021/02/08 Python
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
Ray-Ban雷朋瑞典官方网站:全球领先的太阳眼镜品牌
2019/08/22 全球购物
房地产还款计划书
2014/01/10 职场文书
安全责任书怎么写
2014/07/28 职场文书
领导干部群众路线剖析材料
2014/10/09 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
人生遥控器观后感
2015/06/11 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
vue基于Teleport实现Modal组件
2021/05/31 Vue.js