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中的特殊语法:filter、map、reduce、lambda介绍
Apr 14 Python
Python文件右键找不到IDLE打开项解决办法
Jun 08 Python
使用python语言,比较两个字符串是否相同的实例
Jun 29 Python
Python中的Django基本命令实例详解
Jul 15 Python
python模糊图片过滤的方法
Dec 14 Python
解决.ui文件生成的.py文件运行不出现界面的方法
Jun 19 Python
Python OpenCV之图片缩放的实现(cv2.resize)
Jun 28 Python
Django模板Templates使用方法详解
Jul 19 Python
Python从入门到精通之环境搭建教程图解
Sep 26 Python
Python浮点数四舍五入问题的分析与解决方法
Nov 19 Python
python为什么要安装到c盘
Jul 20 Python
pytorch 如何把图像数据集进行划分成train,test和val
May 31 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实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
jQuery 源码分析笔记(6) jQuery.data
2011/06/08 Javascript
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
node.js中的fs.chmodSync方法使用说明
2014/12/18 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
2015/04/02 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
vue-axios使用详解
2017/05/10 Javascript
jQuery遮罩层实例讲解
2017/05/11 jQuery
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
2017/09/06 Javascript
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
详解Django中的权限和组以及消息
2015/07/23 Python
python实现简易通讯录修改版
2018/03/13 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
高一化学教学反思
2014/02/05 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
幼师大班个人总结
2015/02/13 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
python中requests库+xpath+lxml简单使用
2021/04/29 Python
React列表栏及购物车组件使用详解
2021/06/28 Javascript
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL