Python基于TCP协议传输图片数据的实现方案
本文介绍了使用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()
以上即为本文的全部内容,希望该示例能对您的学习有所帮助。如果您觉得有用,欢迎支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













