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随机生成指定长度密码的方法
Apr 04 Python
Python实现信用卡系统(支持购物、转账、存取钱)
Jun 24 Python
巧用python和libnmapd,提取Nmap扫描结果
Aug 23 Python
Python实现获取磁盘剩余空间的2种方法
Jun 07 Python
python 函数传参之传值还是传引用的分析
Sep 07 Python
python3.6的venv模块使用详解
Aug 01 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
pycharm实现在虚拟环境中引入别人的项目
Mar 09 Python
python如何写个俄罗斯方块
Nov 06 Python
如何用python 操作zookeeper
Dec 28 Python
用Python实现Newton插值法
Apr 17 Python
Python3的进程和线程你了解吗
Mar 16 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
escape unescape的php下的实现方法
2007/04/27 PHP
php数据访问之查询关键字
2016/05/09 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
Javascript表格翻页效果实现思路及代码
2013/08/23 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
纯前端JavaScript实现Excel IO案例分享
2016/08/26 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
Python彩色化Linux的命令行终端界面的代码实例分享
2016/07/02 Python
基于Python函数和变量名解析
2019/07/19 Python
Python中关于浮点数的冷知识
2019/09/22 Python
Python装饰器结合递归原理解析
2020/07/02 Python
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
大学生职业生涯规划范文
2014/01/08 职场文书
顶碗少年教学反思
2014/02/21 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
2016春节家属慰问信
2015/03/25 职场文书
交通事故被告答辩状
2015/05/22 职场文书
2016猴年春节问候语
2015/11/11 职场文书
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis
MySQL里面的子查询的基本使用
2021/08/02 MySQL