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

news2024/7/2 3:40:58

一. 前言

在网络编程中,粘包是指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】粘包常见的一种方法处理,后续有时间会在介绍另一种方法。希望文章对你有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现单链表的增删改查

实现单链表的增删改查的功能&#xff1a;头部插入删除/尾部插入删除&#xff0c;查找&#xff0c;在指定位置之前插入数据&#xff0c;删除pos节点&#xff0c;在指定位置之后插入数据&#xff0c;删除pos之后的节点&#xff0c;销毁链表。 SListNode.h #pragma once #includ…

美,英,法,德、意大利和西班牙的geojson,以及区域json

美&#xff0c;英&#xff0c;法&#xff0c;德、意大利和西班牙的geojson文件 json地址 https://pan.baidu.com/s/1nio1bV_j-jAEVqgEHXWsNw?pwdqwer#list/path/GEOJSON 感谢大佬提供的 大佬连接 大佬的知乎原地址 国内geojson获取工具地址 http://da![在这里插入图片描述](h…

【wu-framework-parent 1.2.2-JDK17-SNAPSHOT 新版本中的 ACW】

版本: 1.2.2-JDK17-SNAPSHOT 项目地址&#xff1a;https://gitee.com/wujiawei1207537021/wu-framework-parent/tree/master/wu-smart-intergration/wu-smart-acw 演示地址&#xff1a;http://124.222.48.62:30193/wu-smart-acw-ui/index.html admin/admin docker启动 dock…

智能控制箱解决方案

一、建设背景 在数字时代的浪潮中&#xff0c;智能化的管理和操作已经成为各行业的共同追求。唯众物联网智能控制箱&#xff0c;是一款功能性强、使用安装简单的智能网络传输、温湿度监测、门锁控制综合系统。系统由I/O网络模块、传感器、管理后端、移动端APP组成&#xff0c;辅…

docker-compose搭建redis哨兵模式

文件存放如下图&#xff1a; docker-compose.yml文件内容如下&#xff1a; version: 3.3 services:master:image: redis:3.2.12restart: alwayscontainer_name: redis-mastercommand: redis-server /usr/local/redis/conf/redis.confports:- 6380:6380volumes:- /root/redis/…

【源码】医院绩效管理系统,针对医、护、技、药、管不同岗位,可设置不同的核算方法、核算参数

医院绩效管理系统源码 医院绩效管理系统以国家医院绩效管理考核政策法规为依据&#xff0c;结合医院管理实践&#xff0c;以经济管理指标为核心&#xff0c;医疗质量、安全、效率、效益管理为重点&#xff0c;特别强调持续改进&#xff08;PDCA&#xff09;管理理念。实现医院绩…

从专线到云桥通SD-WAN企业组网开通速度对比

云桥通SD-WAN企业组网和专线是企业在建立和管理广域网连接时广泛采用的两种技术和解决方案。 云桥通SD-WAN企业组网基于软件定义网络技术&#xff0c;通过引入虚拟化、智能路由和网络功能虚拟化等技术&#xff0c;实现对多种网络连接的集中管理和控制。云桥通SD-WAN企业组网能够…

Cyber RT 服务通信

场景&#xff1a; 用户乘坐无人出租车过程中&#xff0c;可能临时需要切换目的地&#xff0c;用户可以通过车机系统完成修改&#xff0c;路径规划模块需要根据新的目的地信息重新规划路径&#xff0c;并反馈修正后的结果给用户&#xff0c;那么用户的修正请求数据与修正结果是如…

LINUX服务之YUM仓库

1. YUM概述 YUM基于RPM包构建的软件更新机制 可以自动解决依赖关系 所有软件包由集中的YUM软件仓库提供 YUM支持软件源 搭建yum支持的的软件源主要有以下三种&#xff1a; 本地yum&#xff1a;file&#xff1a;//… 网络yum&#xff0c;又分为HTTP服务器&#xff1a;http…

【开源项目】经典开源项目数字孪生智慧楼宇,分享revit数据

智慧楼宇IBMS可视化运营平台&#xff0c;一个集综合态势、能耗管理、智慧安防和设备运维于一体的智慧管理中心。飞渡科技数字孪生平台集结构、系统、服务、管理及它们之间的最优化组合&#xff0c;使冰冷的混凝土结构演变为智慧化、高效率以及安全性更强的生活和工作空间。 在综…

深度解析Oladance、韶音、南卡开放式耳机:选购指南与天花板级推荐

​随着开放式耳机在日常生活中越来越受欢迎&#xff0c;许多品牌纷纷降低材料品质以迎合大众需求&#xff0c;导致耳机的性能和音质严重下滑。这让消费者在选择优质开放式耳机时感到困惑。作为一名专业的耳机评测人员&#xff0c;我近期对多款热门开放式耳机进行了深入的测评&a…

postman测试导入文件

01 上传文件参数 1.选择请求方式 选择post请求方式&#xff0c;输入请求地址 2.填写Headers Key&#xff1a;Content-Type &#xff1b; Value&#xff1a;multipart/form-data 如下图 3.填写body 选择form-data&#xff0c;key选择file类型后value会出现按钮&#xff0…

2024三掌柜赠书活动第四期: Next.js实战,构建现代化的可扩展Web应用

目录 摘要前言Next.js简介关于《 Next.js实战》实战示例最佳实践和进阶应用编辑推荐内容简介作者简介图书目录书中前言/序言《Next.js实战》全书速览结束语 摘要&#xff1a;本文将介绍Next.js&#xff0c;一个流行的React框架&#xff0c;以及如何在实际项目中使用Next.js构…

vue中封装使用svg图片

vue中封装使用svg图片 svg的优点 &#xff1a; 可以无损放大或缩小&#xff0c;支持多种滤镜和效果&#xff0c;易于修改和编辑 封装组件更加方便使用 1、封装SvgIcon组件 <template><svg :class"svgClass" aria-hidden"true"><use :xli…

Pytorch自动求导机制

PyTorch框架可以帮我们计算好反向传播&#xff0c;需要求导的&#xff0c;可以手动定义 示例&#xff1a; #先构造一个随机的三行四列矩阵&#xff0c;两种方法都可以#方法1 x torch.randn(3,4,requires_gradTrue) x#方法2 x torch.randn(3,4) x.requires_gradTrue x #再构…

路由器配置虚拟服务器

文章目录 路由器配置虚拟服务器1.前言2.配置流程2.1 进入路由器的登录页面2.2 找到端口映射功能2.3 添加虚拟服务器2.4 查找路由器的动态IP2.5 SSH连接 路由器配置虚拟服务器 1.前言 局域网下面连接着路由器&#xff0c;路由器下面连接着服务器&#xff0c;我们自己的电脑想要…

专业Python集成开发 -- Wing Pro 9

Wing Pro 9是一款功能强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为专业开发人员设计。它提供了丰富的功能和工具&#xff0c;旨在提高Python开发人员的生产力。 Wing Pro 9的核心特点包括高级代码编辑器、调试器、重构工具、版本控制等。高级代码编辑…

buffer pool和查询缓存的区别

在学习buffer pool的时候我产生了疑问&#xff0c;buffer pool和查询缓存是一个东西吗&#xff1f; 结论&#xff1a;不是一回事。 buffer pool buffer pool我之前介绍过&#xff0c;它的出现是为了提高查找效率&#xff0c;缓存磁盘上的数据页。 buffer pool虽说是内存中的一…

速锐得解码匹配吉利枫叶80V/60S远程控制汽车应用B端市场

吉利枫叶80V/60S这两款车平时是不多见的&#xff0c;因为吉利枫叶的定位就的B端市场&#xff0c;包括了公务用车、共享出行、网约车、大客户定制&#xff0c;所以&#xff0c;好风凭借力&#xff0c;送我上青云&#xff0c;吉利在默默地发着一笔小财&#xff0c;或者说拓宽了更…

java遍历(for和forEach)

1.dade文件 package model;public class dade {private int id;private String name;public dade() {}public dade(int id, String name) {this.id id;this.name name;}public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {r…