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 28 Python
Python中的pass语句使用方法讲解
May 14 Python
浅析Python中signal包的使用
Nov 13 Python
Python的GUI框架PySide的安装配置教程
Feb 16 Python
通过源码分析Python中的切片赋值
May 08 Python
python登录并爬取淘宝信息代码示例
Dec 09 Python
Python实现PS图像明亮度调整效果示例
Jan 23 Python
Python及Django框架生成二维码的方法分析
Jan 31 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
python批量修改xml属性的实现方式
Mar 05 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
Apr 24 Python
GitHub上值得推荐的8个python 项目
Oct 30 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中长文章分页显示实现代码
2012/09/29 PHP
PHP微信开发之模板消息回复
2016/06/24 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
IE和Firefox下event事件杂谈
2009/12/18 Javascript
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
js、css、img等浏览器缓存问题的2种解决方案
2013/10/23 Javascript
jquery事件preventDefault()方法用法实例
2015/01/16 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
2015/07/29 Javascript
通用无限极下拉菜单的实现代码
2016/05/31 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
AngularJS  双向数据绑定详解简单实例
2016/10/20 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
vue监听scroll的坑的解决方法
2017/09/07 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
[01:37]TI4西雅图DOTA2前线报道 VG拿下首胜教练357给出获胜秘诀
2014/07/10 DOTA
举例详解Python中的split()函数的使用方法
2015/04/07 Python
python提取页面内url列表的方法
2015/05/25 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
python3使用print打印带颜色的字符串代码实例
2019/08/22 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
详解python实现可视化的MD5、sha256哈希加密小工具
2020/09/14 Python
H5 canvas中width、height和style的宽高区别详解
2018/11/02 HTML / CSS
给医务人员表扬信
2014/01/12 职场文书
公务员保密承诺书
2014/03/27 职场文书
关于开学的感想
2015/08/10 职场文书
MySQL插入数据与查询数据
2022/03/25 MySQL