使用python tcp 网络库发送图片和文字数据

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 时序图

下面是数据发送和接收的时序图,展示了客户端发送数据包并由服务端接收、解析的过程:

Client Server 建立TCP连接 确认连接 发送数据包 接收数据包头部(ID, 文本大小,图片1大小,图片2大小) 接收数据内容(文本和图片数据) 数据接收确认 处理接收到的数据(解析文本和图片数据) Client Server

针对使用Python TCP网络库发送图片和文字数据的方案,我们可以从优缺点出发,并提出一些后续改进建议。

2. 优缺点

优点

  • 跨平台性
    TCP协议和Python语言的跨平台特性使得这种实现方式在不同操作系统下都能够良好运行。

  • 适合小规模应用
    对于小规模的数据传输和简单的网络通信需求,Python TCP网络库足够满足要求作。

缺点:

  • 性能限制
    Python作为解释型语言,在处理大量数据或高并发情况下性能不行。

  • 数据包大小和传输效率
    使用base64编码图片会导致数据包的大小增加,影响网络传输效率,尤其是在带宽有限或网络环境不稳定时会显得不够高效。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘色的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值