0. 引言
在实际python开发中,经常需要通过网络传输同时包含文本和图片等二进制数据的信息。
本文将使用Python语言,基于TCP协议,展示如何发送包含文本和图片数据的数据包,并使用时序图解释发送和接收的流程。
1. 分析过程
1.1 服务端代码
服务端代码负责接收来自客户端的数据包,解析其中的文本和图片数据,并进行相应的处理。以下是服务端的关键代码部分:
import socket
import struct
import threading
import queue
read_queue = queue.Queue() # 接收消息队列
def recv_msg_handle():
global read_queue
while True:
body = read_queue.get()
id, content_size, img_size1, img_size2 = struct.unpack('>IIII', body[:16])
content = body[16:16+content_size]
img1 = body[16+content_size:16+content_size+img_size1]
img2 = body[16+content_size+img_size1:16+content_size+img_size1+img_size2]
# 在这里可以添加具体的业务处理逻辑,例如保存文件等操作
if __name__ == '__main__':
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
msg_thread = threading.Thread(target=recv_msg_handle)
msg_thread.setDaemon(True)
msg_thread.start()
server_socket.bind(('192.21.1.43', 8701))
server_socket.listen(1)
client_socket, addr = server_socket.accept()
client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 10*1024*1024)
while True:
head = client_socket.recv(16)
id, content_size, img_size1, img_size2 = struct.unpack('>IIII', head)
body = b''
body_length = content_size + img_size1 + img_size2
while len(body) < body_length:
data = client_socket.recv(body_length - len(body))
body += data
read_queue.put(body)
1.2 客户端代码
客户端代码负责将文本内容和图片数据打包成二进制数据包,并通过TCP连接发送到服务端。以下是客户端的关键代码部分:
import socket
import struct
import base64
def pack():
id = 1234
content = "Here are some brief details. To begin with, there is no doubt that you should be familiar with the professional skills as soon as possible. What is more, in order to make a deep impression on your manager, I do recommend that you arrive at your office in advance every day. Finally, it is also important to maintain a good relationship with your colleagues."
content = content.encode(encoding="utf-8")
content_size = len(content)
with open('beng.jpg', 'rb') as f:
img1 = f.read()
img_size1 = len(img1)
img2 = b'' # 第二张图片数据,这里假设为空
img_size2 = len(img2)
ss = struct.pack('>IIII%ds%ds%ds' % (content_size, img_size1, img_size2), id, content_size, img_size1, img_size2, content, img1, img2)
return ss
if __name__ == '__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('192.21.1.43', 8701))
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10*1024*1024)
ss = pack()
sock.send(ss)
sock.close()
1.3 时序图
下面是数据发送和接收的时序图,展示了客户端发送数据包并由服务端接收、解析的过程:
针对使用Python TCP网络库发送图片和文字数据的方案,我们可以从优缺点出发,并提出一些后续改进建议。
2. 优缺点
优点:
-
跨平台性:
TCP协议和Python语言的跨平台特性使得这种实现方式在不同操作系统下都能够良好运行。 -
适合小规模应用:
对于小规模的数据传输和简单的网络通信需求,Python TCP网络库足够满足要求作。
缺点:
-
性能限制:
Python作为解释型语言,在处理大量数据或高并发情况下性能不行。 -
数据包大小和传输效率:
使用base64编码图片会导致数据包的大小增加,影响网络传输效率,尤其是在带宽有限或网络环境不稳定时会显得不够高效。