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中Collection的使用小技巧
Aug 18 Python
Python实现从URL地址提取文件名的方法
May 15 Python
Pyhton中单行和多行注释的使用方法及规范
Oct 11 Python
django基础之数据库操作方法(详解)
May 24 Python
python先序遍历二叉树问题
Nov 10 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
Nov 29 Python
python tkinter canvas 显示图片的示例
Jun 13 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
Apr 18 Python
浅谈JupyterNotebook导出pdf解决中文的问题
Apr 22 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
Django返回HTML文件的实现方法
Sep 17 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
Dec 24 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
phpBB BBcode处理的漏洞
2006/10/09 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
php微信公众平台开发(一) 配置接口
2016/12/06 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
JQuery+JS实现仿百度搜索结果中关键字变色效果
2011/08/02 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
2015/07/27 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
BootStrap 导航条实例代码
2017/05/18 Javascript
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
使用JavaScript获取Django模板指定键值数据
2020/05/27 Javascript
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
Python处理Excel文件实例代码
2017/06/20 Python
python设置环境变量的原因和方法
2019/06/24 Python
python实现拉普拉斯特征图降维示例
2019/11/25 Python
基于torch.where和布尔索引的速度比较
2020/01/02 Python
Python PyInstaller安装和使用教程详解
2020/01/08 Python
django中url映射规则和服务端响应顺序的实现
2020/04/02 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
html5使用Drag事件编辑器拖拽上传图片的示例代码
2017/08/22 HTML / CSS
2014年医院后勤工作总结
2014/12/06 职场文书
大学生就业指导课心得体会
2016/01/15 职场文书
python 如何在 Matplotlib 中绘制垂直线
2021/04/02 Python