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中matplotlib中文乱码解决办法
May 12 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
Jan 09 Python
详解Django 中是否使用时区的区别
Jun 14 Python
Python实现求解一元二次方程的方法示例
Jun 20 Python
Python 爬虫之Beautiful Soup模块使用指南
Jul 05 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
May 15 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
Feb 06 Python
Python爬虫之爬取某文库文档数据
Apr 21 Python
使用Django框架创建项目
Jun 10 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
索尼SONY ICF-7600A(W)电路分析
2021/03/01 无线电
php set_time_limit(0) 设置程序执行时间的函数
2010/05/26 PHP
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
php curl批处理实现可控并发异步操作示例
2018/05/09 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
PHP中的异常处理机制深入讲解
2020/11/10 PHP
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
javascript实现很浪漫的气泡冒出特效
2020/09/05 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
pycharm的console输入实现换行的方法
2019/01/16 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
2019/07/11 Python
Python实现图像的垂直投影示例
2020/01/17 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
用 Python 制作地球仪的方法
2020/04/24 Python
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
eBay加拿大站:eBay.ca
2019/06/20 全球购物
高三自我鉴定
2013/10/23 职场文书
小学生评语集锦
2014/04/18 职场文书
文案策划专业自荐信
2014/07/07 职场文书
质量主管工作职责
2014/09/26 职场文书
夫妻双方自愿离婚协议书怎么写
2014/12/01 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
oracle表分区的概念及操作
2021/04/24 Oracle
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技