Python基于TCP协议传输图片数据的实现方案

木白
木白
发布时间:2026-10-14| 3人浏览过
原创

本文介绍了使用Python通过TCP协议传输图片数据的具体实现方法。内容涵盖自定义数据包格式(包含魔数、长度及GUID),并提供了客户端读取本地图片进行发送以及服务端接收并保存图片的完整代码示例,适用于需要自定义网络传输协议的场景。

Python TCP传输图片实现概述

本文分享了一个使用Python通过TCP协议传输图片数据的完整示例,供开发者参考。

数据包格式定义

传输的数据包遵循特定的格式规范,具体结构如下所示:

客户端实现逻辑如下:

客户端发送代码实现


import socket
import sys
 
HOST,PORT = "172.18.0.3",19984
 
def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((HOST, PORT))
    
    #包头标志
    arrBuf = bytearray(b'\xff\xaa\xff\xaa')
    
    #以二进制方式读取图片
    picData = open('1.jpg', 'rb')
    picBytes = picData.read()
    
    #图片大小
    picSize = len(picBytes)
    
    #数据体长度 = guid大小(固定) + 图片大小
    datalen = 64 + picSize
    
    #组合数据包
    arrBuf += bytearray(datalen.to_bytes(4, byteorder='little'))
    guid = 23458283482894382928948
    arrBuf += bytearray(guid.to_bytes(64, byteorder='little'))
    arrBuf += picBytes
    
    sock.sendall(arrBuf)
    sock.close()
 
if __name__ == '__main__':
    main()

服务端接收与处理逻辑如下:

服务端接收代码实现


import socketserver
import os
import sys
import time
import threading
 
ip_port=("172.18.0.3",19984)
 
class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        print("conn is :",self.request) # conn
        print("addr is :",self.client_address) # addr
        
        while True:
            try:
                self.str = self.request.recv(8)
                data = bytearray(self.str)
                headIndex = data.find(b'\xff\xaa\xff\xaa')
                print(headIndex)
                
                if headIndex == 0:
                    allLen = int.from_bytes(data[headIndex+4:headIndex+8], byteorder='little')
                    print("len is ", allLen)
 
                    curSize = 0
                    allData = b''
                    while curSize < allLen:
                        data = self.request.recv(1024)
                        allData += data
                        curSize += len(data)
 
                    print("recv data len is ", len(allData))
                    #接收到的数据,前64字节是guid,后面的是图片数据
                    arrGuid = allData[0:64]
                    #去除guid末尾的0
                    tail = arrGuid.find(b'\x00')
                    arrGuid = arrGuid[0:tail]
                    strGuid = str(int.from_bytes(arrGuid, byteorder = 'little')) #for test
                    
                    print("-------------request guid is ", strGuid)
                    imgData = allData[64:]
                    strImgFile = "2.jpg"
                    print("img file name is ", strImgFile)
 
                    #将图片数据保存到本地文件
                    with open(strImgFile, 'wb') as f:
                        f.write(imgData)
                        f.close()
                        
                    break
            except Exception as e:
                print(e)
                break
 
 
if __name__ == "__main__":
    s = socketserver.ThreadingTCPServer(ip_port, MyServer)
    print("start listen")
    s.serve_forever()

以上即为本文的全部内容,希望该示例能对您的学习有所帮助。如果您觉得有用,欢迎支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。