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 11 Python
requests和lxml实现爬虫的方法
Jun 11 Python
Python使用遗传算法解决最大流问题
Jan 29 Python
python删除过期log文件操作实例解析
Jan 31 Python
Django实现分页功能
Jul 02 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
Sep 17 Python
如何用python写一个简单的词法分析器
Dec 18 Python
python按照多个条件排序的方法
Feb 08 Python
Python3实现从排序数组中删除重复项算法分析
Apr 03 Python
使用python list 查找所有匹配元素的位置实例
Jun 11 Python
django项目简单调取百度翻译接口的方法
Aug 06 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
Feb 28 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中的字符串编码转换(自动识别原编码)
2013/07/02 PHP
PHP生成随机密码方法汇总
2015/08/27 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
php session的应用详细介绍
2017/03/22 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
JS保存、读取、换行、转Json报错处理方法
2013/06/14 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
jQuery+JSON实现AJAX二级联动实例分析
2015/12/18 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
jquery自定义显示消息数量
2017/12/19 jQuery
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
js键盘事件实现人物的行走
2020/01/17 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
python基础教程之面向对象的一些概念
2014/08/29 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
详解Python学习之安装pandas
2019/04/16 Python
Python完成毫秒级抢淘宝大单功能
2019/06/06 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
应聘医学检验人员自荐信
2013/09/27 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
保证金退回承诺函格式
2015/01/21 职场文书
英语辞职信怎么写
2015/02/28 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers
SQL Server中锁的用法
2022/05/20 SQL Server