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中cPickle用法例子分享
Jan 03 Python
python中for语句简单遍历数据的方法
May 07 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
Python使用pymongo模块操作MongoDB的方法示例
Jul 20 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 Python
python简单贪吃蛇开发
Jan 28 Python
从列表或字典创建Pandas的DataFrame对象的方法
Jul 06 Python
python tkinter窗口最大化的实现
Jul 15 Python
对DJango视图(views)和模版(templates)的使用详解
Jul 17 Python
django-rest-framework解析请求参数过程详解
Jul 18 Python
python Django里CSRF 对应策略详解
Aug 05 Python
python线程的几种创建方式详解
Aug 29 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+jQuery制作的列表分页的功能模块
2014/10/14 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
基于PHP实现简单的随机抽奖小程序
2016/01/05 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
phpwind放自动注册方法
2006/12/02 Javascript
javascript 建设银行登陆键盘
2008/06/10 Javascript
javascript 类方法定义还是有点区别
2009/04/15 Javascript
基于jQuery实现模拟页面加载进度条
2013/04/01 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
angular实现spa单页面应用实例
2017/07/10 Javascript
Angular自定义组件实现数据双向数据绑定的实例
2017/12/11 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
详解vue中使用vue-quill-editor富文本小结(图片上传)
2019/04/24 Javascript
vue-test-utils初使用详解
2019/05/23 Javascript
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
[41:54]2018DOTA2亚洲邀请赛 4.1 小组赛A组加赛 TNC vs Liquid
2018/04/03 DOTA
Python常用随机数与随机字符串方法实例
2015/04/09 Python
python开发之函数定义实例分析
2015/11/12 Python
python学习 流程控制语句详解
2016/06/01 Python
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
python中字符串内置函数的用法总结
2018/09/13 Python
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
远东集团网络工程师面试题
2014/10/20 面试题
遗嘱公证书标准样本
2014/04/08 职场文书
捐款倡议书格式范文
2014/05/14 职场文书
学校领导班子对照检查材料
2014/09/24 职场文书
2014年学习委员工作总结
2014/11/14 职场文书
民事诉讼代理词
2015/05/25 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技