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 相关文章推荐
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 Python
python实现数据导出到excel的示例--普通格式
May 03 Python
python numpy 部分排序 寻找最大的前几个数的方法
Jun 27 Python
python正向最大匹配分词和逆向最大匹配分词的实例
Nov 14 Python
python 使用值来排序一个字典的方法
Nov 16 Python
程序员写Python时的5个坏习惯,你有几条?
Nov 26 Python
Python中使用遍历在列表中添加字典遇到的坑
Feb 27 Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 Python
机器学习实战之knn算法pandas
Jun 22 Python
python实现在函数中修改变量值的方法
Jul 16 Python
Python3 批量扫描端口的例子
Jul 25 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
Mar 09 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
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
ThinkPHP缓存方法S()概述
2014/06/13 PHP
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
JavaScript中“+=”的应用
2007/02/02 Javascript
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
简单封装js的dom查询实例代码
2016/07/08 Javascript
js拼接html字符串的注意事项
2016/10/13 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
2016/12/26 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
2019/11/09 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
python requests 使用快速入门
2017/08/31 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
python如何实现复制目录到指定目录
2020/02/13 Python
推荐值得学习的12款python-web开发框架
2020/08/10 Python
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
Java平台和其他软件平台有什么不同
2015/06/05 面试题
《花的勇气》教后反思
2014/02/12 职场文书
创先争优公开承诺书
2014/08/30 职场文书
公司试用期员工自我评价
2014/09/17 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
合作意向协议书
2015/01/29 职场文书
兵马俑导游词
2015/02/02 职场文书
放假通知
2015/04/14 职场文书