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发布模块的步骤分享
Feb 21 Python
Python中的random()方法的使用介绍
May 15 Python
python批量制作雷达图的实现方法
Jul 26 Python
python利用MethodType绑定方法到类示例代码
Aug 27 Python
Python开发的十个小贴士和技巧及长常犯错误
Sep 27 Python
python组合无重复三位数的实例
Nov 13 Python
Python配置虚拟环境图文步骤
May 20 Python
Python中新式类与经典类的区别详析
Jul 10 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
Oct 24 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
Dec 10 Python
使用tensorflow显示pb模型的所有网络结点方式
Jan 23 Python
如何真正的了解python装饰器
Aug 14 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
各种咖啡的英文名子是什么
2021/03/03 新手入门
用PHP的ob_start();控制您的浏览器cache!
2006/11/25 PHP
php学习 函数 课件
2008/06/15 PHP
php实现简单的语法高亮函数实例分析
2015/04/27 PHP
js 数据类型转换总结笔记
2011/01/17 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
jQuery中triggerHandler()方法用法实例
2015/01/19 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
js内置对象处理_打印学生成绩单的简单实现
2016/09/24 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
2016/12/02 Javascript
jQuery 实现左右两侧菜单添加、移除功能
2018/01/02 jQuery
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
原生JS实现的简单小钟表功能示例
2018/08/30 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
2019/11/27 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
Vue路由权限控制解析
2020/11/09 Javascript
Python的ORM框架SQLObject入门实例
2014/04/28 Python
python使用urllib2提交http post请求的方法
2015/05/26 Python
Python随机生成带特殊字符的密码
2016/03/02 Python
python使用Matplotlib绘制分段函数
2018/09/25 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
python 检测图片是否有马赛克
2020/12/01 Python
python函数超时自动退出的实操方法
2020/12/28 Python
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
个人充满哲理的自我评价
2014/02/20 职场文书
小学班主任培训方案
2014/06/04 职场文书
通用员工手册范本
2015/05/14 职场文书
工作态度怎么写
2015/06/25 职场文书
使用canvas实现雪花飘动效果的示例代码
2021/03/30 HTML / CSS
PHP 对接美团大众点评团购券(门票)的开发步骤
2021/04/03 PHP
vue使用echarts实现折线图
2022/03/21 Vue.js