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实现读取大文件并逐行写入另外一个文件
Apr 19 Python
利用Python在一个文件的头部插入数据的实例
May 02 Python
Python使用Selenium爬取淘宝异步加载的数据方法
Dec 17 Python
这可能是最好玩的python GUI入门实例(推荐)
Jul 19 Python
django-rest-swagger的优化使用方法
Aug 29 Python
python中enumerate() 与zip()函数的使用比较实例分析
Sep 03 Python
Python队列、进程间通信、线程案例
Oct 25 Python
python线程定时器Timer实现原理解析
Nov 30 Python
django模板获取list中指定索引的值方式
May 14 Python
Python turtle库的画笔控制说明
Jun 28 Python
python 实现批量图片识别并翻译
Nov 02 Python
详解python字符串驻留技术
May 21 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编程中八种常见的文件操作方式
2006/11/19 PHP
不错的一篇面向对象的PHP开发模式(简写版)
2007/03/15 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
php Calender(日历)代码分享
2014/01/03 PHP
php利用header函数下载各种文件
2016/08/24 PHP
PHP获取不了React Native Fecth参数的解决办法
2016/08/26 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
2018/10/14 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
JS实现点击上移下移LI行数据的方法
2015/08/05 Javascript
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
js生成word中图片处理方法
2018/01/06 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
[01:22:28]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第一场 1月18日
2021/03/11 DOTA
实例讲解python函数式编程
2014/06/09 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
canvas 阴影和图形变换的示例代码
2018/01/02 HTML / CSS
美国网上眼镜商城:Zenni Optical
2016/11/20 全球购物
皮尔·卡丹巴西官方商店:Pierre Cardin
2017/07/21 全球购物
eBay爱尔兰站:eBay.ie
2019/08/09 全球购物
AJAX都有哪些有点和缺点
2012/11/03 面试题
Java程序员综合测试题
2014/04/25 面试题
如何安装ruby on rails
2014/02/09 面试题
村居抓节水倡议书
2014/05/19 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB