python用socket传输图片的项目实践

 更新时间:2024年02月22日 09:28:32   作者:Aix959  
使用python在网络上传送图片数据,需要以byte格式读取图片,这样才可以通过socket传输,本文就来介绍了python用socket传输图片的项目实践,具有一定的参考价值,感兴趣的可以了解一下

本来想一次连接发送多张图片,但由于处理间隔的逻辑容易导致图片丢失等问题,所以这里采用的是每次连接只发送一张图片

发送的形式是base64编码,可以有效的适用于各种项目

客户端

import time
import cv2
import os
import base64
from socket import *


class Client:
    def __init__(self, host="127.0.0.1", port=8001):
        self.host = host
        self.port = port
        self.socket = self.connect()

    def connect(self):
        tcp_socket = socket()
        tcp_socket.connect((self.host, self.port))
        return tcp_socket
    
    # 发送的是编码,有些项目中就不需要保存路径,直接发送编码了
    def base64_encode_img(self, img_data):
        _, image_encoded = cv2.imencode('.jpg', img_data)
        image_bytes = image_encoded.tobytes()
        image_base64 = base64.b64encode(image_bytes).decode('utf-8')
        return image_base64

    def get_img(self, img_path):
        img = cv2.imread(img_path)
        img_d = self.base64_encode_img(img)
        img_b = img_d.encode()
        return img_b

    def send_msg(self, msg):
        self.socket.send(msg.encode())

    def send_img(self, img_path):
        img_data = self.get_img(img_path)
        n = 0
        while True:
            self.socket.send(img_data[n:n + 1024])
            n += 1024
            if n > len(img_data):
                print(f"已发送:{img_path}")
                break

    def close(self):
        self.socket.close()


if __name__ == '__main__':

    path = "C:/Users/cheng/Desktop/Spider/dilireba"   # 图片路径
    # path = "C:/Users/cheng/Desktop/Spider/gulinazha"
    # path = "C:/Users/cheng/Desktop/Spider/boduo"
    pics = os.listdir(path)
    for pic in pics:
        C = Client(host="127.0.0.1", port=8001)
        p_p = path + "/" + pic
        C.send_img(p_p)  # 发送单张图片
        C.close()

服务端

服务器与连接分离处理,可以有效控制连接,避免单个连接影响服务运行

import os
from socket import *
import base64


# 图片解码
def base64_decode_img(base64_code):
    """
    :param base64_code: base64编码
    :return: 二进制据,直接写入保存为图片
    """
    img_bytes = base64.b64decode(base64_code)
    return img_bytes


class WebSocketServer:
    def __init__(self, host="127.0.0.1", port=8001):
        self.socket = socket()
        self.host = host
        self.port = port

    def bind(self):
        """监听套接字"""
        self.socket.bind((self.host, self.port))
        self.socket.listen()  # 设置监听套接字

    def bind_connection(self):
        """建立连接"""
        while True:
            print("等待连接....")
            conn, addr = self.socket.accept()  # 连接 conn是连接对象;addr=(host,port)
            print(f"连接到:{addr[0]}\t端口:{addr[1]}")
            return conn, addr

    def close(self):
        """ 关闭监听套接字"""
        self.socket.close()


class Connection:
    def __init__(self, conn, addr):
        self.conn = conn
        self.addr = addr
        self.save_path = "recv/"
        self.flag = False

    def close(self):
        """断开连接"""
        self.conn.close()
        print(f"{self.addr[0]}:{self.addr[1]}断开连接")

    def send_msg(self, message):
        """发送信息"""
        self.conn.send(message.encode())

    def receive_msg(self, bufsize=1024):
        """接受信息"""
        data_received = self.conn.recv(bufsize).decode()
        return data_received

    def handle(self, count):
        if not os.path.exists(self.save_path):
            os.makedirs(self.save_path)
        img_data = "" # 需要存储的图片数据
        while True:
            data = self.receive_msg()  # 持续获取该对象信息
            if data:
                img_data += data
            else:
                self.flag = True
                break
        d = base64_decode_img(img_data)
        with open(f"{self.save_path}/{count}.jpg", "wb") as f:
            f.write(d) if d else None


if __name__ == '__main__':
    webserver = WebSocketServer(host="127.0.0.1", port=8001)
    webserver.bind()
    count = 0
    while True:
        conn, addr = webserver.bind_connection()
        con = Connection(conn, addr)
        while True:
            con.handle(count)
            count += 1
            print(f"完成{count}")
            if con.flag: break

到此这篇关于python用socket传输图片的项目实践的文章就介绍到这了,更多相关python socket传输图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • pytorch学习教程之自定义数据集

    pytorch学习教程之自定义数据集

    这篇文章主要给大家介绍了关于pytorch学习教程之自定义数据集的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 利用python中pymysql操作MySQL数据库的新手指南

    利用python中pymysql操作MySQL数据库的新手指南

    PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,Python2中是使用mysqldb,这篇文章主要给大家介绍了关于利用python中pymysql操作MySQL数据库的相关资料,需要的朋友可以参考下
    2021-09-09
  • 对python中的 os.mkdir和os.mkdirs详解

    对python中的 os.mkdir和os.mkdirs详解

    今天小编就为大家分享一篇对python中的 os.mkdir和os.mkdirs详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • python识别验证码的思路及解决方案

    python识别验证码的思路及解决方案

    在本篇内容里小编给大家整理的是一篇关于python识别验证码的思路及解决方案,有需要的朋友们可以参考下。
    2020-09-09
  • python中Class(类)的超详细说明

    python中Class(类)的超详细说明

    这篇文章主要介绍了python中Class(类)的相关资料,Class类定义了具有相同属性和方法的对象集合,对象是类的实例,类变量在整个实例化的对象中是公用的,而实例变量是每个对象独有的,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-11-11
  • Python+OpenCV实战之利用 K-Means 聚类进行色彩量化

    Python+OpenCV实战之利用 K-Means 聚类进行色彩量化

    这篇文章主要介绍了如何利用 K-Means 聚类进行色彩量化,以减少图像中颜色数量。文中的代码具有一定的学习价值,感兴趣的小伙伴可以关注一下
    2021-12-12
  • Python实现获取nginx服务器ip及流量统计信息功能示例

    Python实现获取nginx服务器ip及流量统计信息功能示例

    这篇文章主要介绍了Python实现获取nginx服务器ip及流量统计信息功能,涉及Python针对nginx服务器信息操作相关实现技巧,需要的朋友可以参考下
    2018-05-05
  • python数据类型可变与不可变深入分析

    python数据类型可变与不可变深入分析

    这篇文章主要为大家介绍了python数据类型可变与不可变深入分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • python 上下文管理器使用方法小结

    python 上下文管理器使用方法小结

    本文介绍了Python中的上下文管理器,以及如何结合with语句来使用上下文管理器,并且总结了一下with 语句的执行流程。在很多情况下,with语句可以简化代码,并增加代码的健壮性。
    2017-10-10
  • 基于Python编写一个根据姓名测性别的小程序

    基于Python编写一个根据姓名测性别的小程序

    这篇文章主要为大家介绍了如何利用Python编写一款根据中文名能猜测性别的一款界面化的小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-03-03

最新评论