python 使用socket传输图片视频等文件的实现方式


Posted in Python onAugust 07, 2019

在开发一些需要网络通信的应用中,经常会用到各种网络协议进行通信,博主在开发实验室的机器人的时候就遇到了需要把机器人上采集到的图片传回服务器进行处理识别,在python下的实现方式如下(只贴出了关键代码)

服务器端

LOCAL_IP = '192.168.100.22'  #本机在局域网中的地址,或者写127.0.0.1
PORT = 2567          #指定一个端口
def server():
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # socket.AF_INET 指ipv4 socket.SOCK_STREAM 使用tcp协议
  sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #设置端口
  sock.bind((LOCAL_IP, PORT))    #绑定端口
  sock.listen(3)          #监听端口
  while True:
    sc,sc_name = sock.accept()  #当有请求到指定端口是 accpte()会返回一个新的socket和对方主机的(ip,port)
    print('收到{}请求'.format(sc_name))
    infor = sc.recv(1024)    #首先接收一段数据,这段数据包含文件的长度和文件的名字,使用|分隔,具体规则可以在客户端自己指定
    length,file_name = infor.decode().split('|')
    if length and file_name:
      newfile = open('image/'+str(random.randint(1,10000))+'.jpg','wb') #这里可以使用从客户端解析出来的文件名
      print('length {},filename {}'.format(length,file_name))
      sc.send(b'ok')  #表示收到文件长度和文件名
      file = b''
      total = int(length)
      get = 0
      while get < total:     #接收文件
        data = sc.recv(1024)
        file += data
        get = get + len(data)
      print('应该接收{},实际接收{}'.format(length,len(file)))
      if file:
        print('acturally length:{}'.format(len(file)))
        newfile.write(file[:])
        newfile.close()
        sc.send(b'copy')  #告诉完整的收到文件了
    sc.close()

客户端

address = ('192.168.100.22', 2567)
def send(photos):
  for photo in photos[0]:
    print('sending {}'.format(photo))
    data = file_deal(photo)
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(address)
    sock.send('{}|{}'.format(len(data), file).encode())  #默认编码 utf-8,发送文件长度和文件名
    reply = sock.recv(1024)
    if 'ok' == reply.decode():       #确认一下服务器get到文件长度和文件名数据
      go = 0
      total = len(data)
      while go < total:            #发送文件
        data_to_send = data[go:go + 1024]
        sock.send(data_to_send)
        go += len(data_to_send)
      reply = sock.recv(1024)
      if 'copy' == reply.decode():
        print('{} send successfully'.format(photo))
    sock.close()           #由于tcp是以流的形式传输数据,我们无法判断开头和结尾,简单的方法是没传送一个文件,就使用一个socket,但是这样是消耗计算机的资源,博主正在探索更好的方法,有机会交流一下
def file_deal(file_path):  #读取文件的方法
  mes = b''
  try:
    file = open(file_path,'rb')
    mes = file.read()
  except:
    print('error{}'.format(file_path))
  else:
    file.close()
    return mes

总结

以上所述是小编给大家介绍的python 使用socket传输图片视频等文件的实现方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python读取浮点数和读取文本文件示例
May 06 Python
python中__call__方法示例分析
Oct 11 Python
Python argv用法详解
Jan 08 Python
Python两个内置函数 locals 和globals(学习笔记)
Aug 28 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
Jul 04 Python
python批量图片处理简单示例
Aug 06 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
基于Python实现大文件分割和命名脚本过程解析
Sep 29 Python
pytorch中torch.max和Tensor.view函数用法详解
Jan 03 Python
Python日志logging模块功能与用法详解
Apr 09 Python
keras 多任务多loss实例
Jun 22 Python
Python DES加密实现原理及实例解析
Jul 17 Python
python获取Pandas列名的几种方法
Aug 07 #Python
python 提取文件指定列的方法示例
Aug 07 #Python
PyQt Qt Designer工具的布局管理详解
Aug 07 #Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
Aug 07 #Python
python利用7z批量解压rar的实现
Aug 07 #Python
django基础学习之send_mail功能
Aug 07 #Python
python实现本地批量ping多个IP的方法示例
Aug 07 #Python
You might like
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
PHP输出两个数字中间有多少个回文数的方法
2015/03/23 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
2016/03/09 PHP
PHP执行系统命令函数实例讲解
2021/03/03 PHP
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
jquery 隐藏与显示tr标签示例代码
2014/06/06 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
vue实现日历备忘录功能
2020/09/24 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
python 全局变量的import机制介绍
2017/09/07 Python
python判断字符串是否是json格式方法分享
2017/11/07 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
Django 静态文件配置过程详解
2019/07/23 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
毕业生面试求职信
2014/06/23 职场文书
学生无故旷课检讨书
2014/09/20 职场文书
展览会邀请函
2015/02/02 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技