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使用BeautifulSoup分页网页中超链接的方法
Apr 04 Python
总结Python编程中三条常用的技巧
May 11 Python
Python 基础之字符串string详解及实例
Apr 01 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
详解如何设置Python环境变量?
May 13 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
Aug 20 Python
python字符串的拼接方法总结
Nov 18 Python
基于python实现把json数据转换成Excel表格
May 07 Python
python对接ihuyi实现短信验证码发送
May 10 Python
keras中的backend.clip用法
May 22 Python
Python如何爬取b站热门视频并导入Excel
Aug 10 Python
Pycharm安装第三方库失败解决方案
Nov 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
php+mysql开源XNA 聚合程序发布 下载
2007/07/13 PHP
php实现的遍历文件夹下所有文件,编辑删除
2010/01/05 PHP
php 获取本机外网/公网IP的代码
2010/05/09 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
2010/10/19 PHP
浅析php学习的路线图
2013/07/10 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
2015/12/10 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
2014/03/08 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
nodejs微信公众号支付开发
2016/09/19 NodeJs
详解Javascript中DOM的范围
2017/02/13 Javascript
JS基于贪心算法解决背包问题示例
2017/11/27 Javascript
Vue2.0系列之过滤器的使用
2018/03/01 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
python 排列组合之itertools
2013/03/20 Python
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
python实现取余操作的简单实例
2020/08/16 Python
pytorch下的unsqueeze和squeeze的用法说明
2021/02/06 Python
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
.NET方向面试题
2014/11/20 面试题
实习生求职自荐信
2014/02/07 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
博士论文答辩开场白
2015/06/01 职场文书
2015新员工工作总结范文
2015/10/15 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书
2016年领导干部廉政承诺书
2016/03/24 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js