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实现命令行闹钟脚本实例
Sep 05 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
Aug 23 Python
pyshp创建shp点文件的方法
Dec 31 Python
对Python3 pyc 文件的使用详解
Feb 16 Python
解决Python3 被PHP程序调用执行返回乱码的问题
Feb 16 Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 Python
Python小白必备的8个最常用的内置函数(推荐)
Apr 03 Python
Pandas0.25来了千万别错过这10大好用的新功能
Aug 07 Python
解决python明明pip安装成功却找不到包的问题
Aug 28 Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 Python
python中栈的原理及实现方法示例
Nov 27 Python
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 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与分页效率
2008/06/04 PHP
jQuery 源码分析笔记
2011/05/25 PHP
php获取汉字首字母的函数
2013/11/07 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
初识ThinkPHP控制器
2016/04/07 PHP
jquery中实现标签切换效果的代码
2011/03/01 Javascript
javascript实现切换td中的值
2014/12/05 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
微信小程序之仿微信漂流瓶实例
2016/12/09 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
浅谈vuejs实现数据驱动视图原理
2018/02/23 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
[49:35]LGD vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
centos下更新Python版本的步骤
2013/02/12 Python
让 python 命令行也可以自动补全
2014/11/30 Python
Python实现控制台中的进度条功能代码
2017/12/22 Python
解决python中无法自动补全代码的问题
2018/12/04 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
Python实现动态循环输出文字功能
2020/05/07 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
python中实现栈的三种方法
2020/12/19 Python
HTML5为输入框添加语音输入功能的实现方法
2017/02/06 HTML / CSS
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
Zooplus罗马尼亚:宠物食品和配件
2019/11/02 全球购物
城市轨道专业个人求职信范文
2013/09/23 职场文书
《三峡》教学反思
2014/03/01 职场文书
2015年秋季校长开学典礼致辞
2015/07/29 职场文书
如何写好活动总结
2019/06/21 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript
浅谈Python数学建模之线性规划
2021/06/23 Python