Python - 【Socket】消息粘包处理demo(一)

一. 前言

在网络编程中,粘包是指TCP协议在传输过程中,多条数据被合并成一条数据发送或者一条数据被拆分成多个数据发送的现象。

二. 粘包问题的常规处理方法:

使用固定长度的包头 可以在发送数据前先发送一个固定长度的包头,包头中包含了数据的长度信息。接收方根据包头中的长度信息来正确地拆分数据。

三. 示例代码

2. 接收方:【server】服务端示例代码

import socket
import struct


def send_message(sock, message):
    # 使用struct将消息长度打包为4字节的二进制数据
    length = len(message)
    sock.send(struct.pack('!I', length))
    # 发送消息内容
    sock.sendall(message)


def recv_message(sock):
    # 接收消息长度
    length_data = recvall(sock, 4)
    length = struct.unpack('!I', length_data)[0]
    # 接收消息内容
    message = recvall(sock, length)
    return message


def recvall(sock, size):
    # 从socket接收指定大小的数据
    data = b''
    while len(data) < size:
        packet = sock.recv(size - len(data))
        if not packet:
            return None
        data += packet
    return data


# 创建TCP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定到本地地址和端口
server_address = ('localhost', 12345)
sock.bind(server_address)

# 开始监听连接
sock.listen(1)

print('等待客户端连接...')

while True:
    # 等待客户端连接
    client_socket, client_address = sock.accept()
    print('客户端已连接:', client_address)

    try:
        while True:
            # 接收客户端消息
            message = recv_message(client_socket)
            if not message:
                break
            print('接收到消息:', message)

            # 发送回复消息
            reply = '已收到消息:' + message.decode('utf-8')
            send_message(client_socket, reply.encode('utf-8'))
            print('发送回复消息:', reply)
    finally:
        # 关闭连接
        client_socket.close()

在服务端代码中,首先创建一个TCP Socket并绑定到本地地址和端口,然后开始监听连接。当有客户端连接时,创建一个新的Socket与客户端通信。通过循环不断接收客户端发送的消息,并将收到的消息回复给客户端。当客户端关闭连接时,关闭对应的Socket,等待下一个客户端连接。

2. 发送方:【client】客户端示例代码

import socket
import struct
import time


def send_message(sock, message):
    # 使用struct将消息长度打包为4字节的二进制数据
    length = len(message)
    sock.send(struct.pack('!I', length))
    # 发送消息内容
    sock.sendall(message)


def recv_message(sock):
    # 接收消息长度
    length_data = recvall(sock, 4)
    length = struct.unpack('!I', length_data)[0]
    # 接收消息内容
    message = recvall(sock, length)
    return message


def recvall(sock, size):
    # 从socket接收指定大小的数据
    data = b''
    while len(data) < size:
        packet = sock.recv(size - len(data))
        if not packet:
            return None
        data += packet
    return data


# 创建TCP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务端
server_address = ('localhost', 12345)
sock.connect(server_address)

while True:
    # 发送消息给服务端
    message = 'Hello, Server!'
    send_message(sock, message.encode('utf-8'))
    print('发送消息:', message)

    # 接收服务端回复消息
    reply = recv_message(sock)
    print('接收到回复消息:', reply.decode('utf-8'))
    time.sleep(1)

运行结果
在这里插入图片描述
在客户端代码中,首先创建一个TCP Socket并连接到服务端。然后发送一条消息给服务端,并接收服务端的回复消息。

四. 总结

需要注意的是,这个代码示例只是演示了如何处理消息粘包的问题,它并不考虑错误处理和异常情况。在实际应用中,需要根据具体需求添加适当的错误处理和异常处理代码。

以上就是关于Python - 【socket】粘包常见的一种方法处理,后续有时间会在介绍另一种方法。希望文章对你有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/342637.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

赠书活动~

关注公众号获得&#xff0c;发送抽奖

hcip---ppp协议

一&#xff1a;网络类型----根据二层数据链路层使用协议的不同&#xff0c;进行的划分 MA--多点接入网络 BMA--广播型多点接入网络 NBMA--非广播型多点接入网络 P2P--点到点网络&#xff1a;当网络中只能两台设备存在&#xff0c;那么这样的网络不需要MAC也能进行通信 二层协议…

用Axure RP 9制作滑块

制作流程 1.打开界面 放置一个水平线 修改长为400 线段为5 2.放入圆 如图 3.修改圆的长和宽 如图 4.将圆变成动态面板 5.设置交互事件 如图 6.增加交互事件 7.增加 8.修改成跟随水平

系统架构演变

1.1系统架构的演变 2008年以后&#xff0c;国内互联网行业飞速发展&#xff0c;我们对软件系统的需求已经不再是过去”能用就行”这种很low的档次了&#xff0c;像抢红包、双十一这样的活动不断逼迫我们去突破软件系统的性能上限&#xff0c;传统的IT企业”能用就行”的开发思…

查看并解析当前jdk的垃圾收集器

概述&#xff1a;复习的时候&#xff0c;学看一下。 命令&#xff1a; -XX:PrintCommandLineFlags 打开idea&#xff0c;配置jvm 把上面命令输入jvm options中即可。 举例代码 这个代码的解析&#xff0c;我上篇文章有写&#xff0c;这个跟本文没有任何关系&#xff1a; …

Elasticsearch 常用信息

简述 本文针对 Elasticsearch&#xff08;简称ES&#xff09;集群6.x版本出现故障时&#xff0c;可通过提供的命令进行排查。 1、集群健康状态 集群健康状态状态说明red不是所有的主要分片都可用。表示该集群中存在不可用的主分片。可以理解为某个或者某几个索引存在主分片丢失…

C#,入门教程(31)——预处理指令的基础知识与使用方法

上一篇&#xff1a; C#&#xff0c;入门教程(30)——扎好程序的笼子&#xff0c;错误处理 try catchhttps://blog.csdn.net/beijinghorn/article/details/124182386 Visual Studio、C#编译器以及C#语法所支持的预处理指令&#xff0c;绝对是天才设计。 编译程序的时候会发现&am…

AI搜索引擎Perplexity来了,谷歌等老牌搜索引擎或许会有新的威胁?

Perplexity AI 是一家 AI 搜索初创公司&#xff0c;它通过结合内容索引技术和大型语言模型的推理能力&#xff0c;提供更便捷和高效的搜索体验。另外&#xff0c;最近很火的小兔子Rabbit R1硬件AI设备中的搜索功能正是这家公司的杰作。在短短一年半的时间里&#xff0c;一个企业…

Qt6入门教程 10:菜单栏、工具栏和状态栏

目录 一.菜单栏 1.Qt Designer 1.1添加菜单和菜单项 1.2添加二级菜单 1.3给菜单和菜单项添加图标 1.4给菜单项添加功能 2.纯手写 二.工具栏 1.Qt Designer 1.1添加工具栏按钮 1.2工具栏的几个重要属性 2.纯手写 三.状态栏 1.Qt Designer 2.纯手写 用Qt Creator新…

Elasticsearch分布式一致性原理剖析(二)-Meta篇

Elasticsearch分布式一致性原理剖析(二)-Meta篇 - 知乎 本文首发于云栖社区(Elasticsearch分布式一致性原理剖析(二)-Meta篇-博客-云栖社区-阿里云 )&#xff0c;由原作者转载。 前言 “Elasticsearch分布式一致性原理剖析”系列将会对Elasticsearch的分布式一致性原理进行…

DAY07_SpringBoot—用法整合MyBatis

目录 1 SpringBoot 用法1.1 环境切换1.1.1 业务需求1.1.2 多环境编辑 1.2 热部署1.2.1 需求说明1.2.2 引入jar包1.2.3 配置IDEA环境 2 SpringBoot整合Mybatis2.1 导入数据库2.2 创建SpringBoot项目2.2.1 创建项目2.2.2 生成POM.xml文件如下2.2.3 Mavenjar包作用范围2.2.4 数据源…

【JavaWeb】日程管理系统 项目搭建 第二期

文章目录 一、数据库准备二、导入依赖 与 JDBC工具类三、pojo包处理四、daodao包工具类 五、service六、controllerservlet 基类 反射 七、加密工具类 MD5八、页面文件九、业务代码9.1 注册业务处理9.2 登录业务处理 总结 一、数据库准备 创建数据库&#xff1a; SET NAMES …

python-自动篇-办公-用Excel画画

文章目录 代码所遇问题ModuleNotFoundError: No module named xlsxwriterFileNotFoundError: [Errno 2] No such file or directory: 111.jpg 效果附件图片excel 代码 # coding: utf-8from PIL import Image from xlsxwriter.workbook import Workbookclass ExcelPicture(obje…

风二西CTF流量题大集合-刷题笔记|NSSCTF流量题(2)

21.[SUCTF 2018 招新赛]follow me SUCTF{password_is_not_weak} 22.[MoeCTF 2022]usb moectf{Learned_a6ou7_USB_trffic} 23.[黑盾杯 2020]Blue flag{Gre4t_j0B_ON_This_Blue_sh4rk} 24.[蓝帽杯 2022 初赛]domainhacker2 提交发现&#xff0c;07ab403ab740c1540c378b0f5aaa4…

vue(vue2)使用svg格式图标

先安装插件 配置svg文件夹&#xff0c;新建icons文件&#xff0c;svg文件夹放svg后缀文件 index.js文件中的配置 import Vue from "vue" import svgIcon from "/common/iconSvg/index.vue"Vue.component(svg-icon,svgIcon) //挂载全局组件//下面…

深入浅出AI落地应用分析:AI音乐生成之「Suno.ai」

接下来会每周集中体验一些通用或者垂直的AI落地应用&#xff0c;主要以一些全球或者国外国内排行较前的产品为研究对象&#xff0c;「AI 产品榜&#xff1a; aicpb.com」以专题的方式在博客进行分享。 本节主要介绍和体验AI音乐生成应用产品Suno AI&#xff0c;Suno来自目前最…

【 CSS 】定位

不要因为小小的失败而放弃大大的梦想&#xff0c;每一次坚持都是通向成功的一步。- 马克吐温 1. 定位 1.1 为何使用定位 我们先来看一个效果&#xff0c;同时思考一下用标准流或浮动能否实现类似的效果&#xff1f; 场景1: 某个元素可以自由的在一个盒子内移动位置&#xff0c…

【MySQL数据库】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 MySQL数据库 &#xff08;一&#xff09;.CentOS 7 安装配置MySQL

基于神经网络的电力系统的负荷预测

一、背景介绍&#xff1a; 电力系统负荷预测是生产部门的重要工作之一&#xff0c;通过准确的负荷预测&#xff0c;可以经济合理地安排机组的启停、减少旋转备用容量、合理安排检修计划、降低发电成本和提高经济效益。负荷预测按预测的时间可以分为长期、中期和短期负荷预测。…

win10系统 pdf 文件无法正常预览

网上也看了不少办法&#xff0c;修改注册表什么的&#xff0c;太麻烦了&#xff0c;尝试了一下下载Adobe Acrobat Reader&#xff0c;安装后就可以成功预览显示啦&#xff01;对&#xff0c;就是这么简单&#xff01;Adobe Acrobat Reader下载链接&#xff1a;link