粘包现象_光柱现象

粘包现象_光柱现象粘包现象当多条消息发送时接受变成了一条或者出现接收不准确的情况粘包现象会发生在发送端两条消息间隔时间短,长度短就会把两条消息在发送之前就拼在一起节省每一次发送消息回复的网络资源粘包现象会发生在接收端多条消息发送到缓存端,但没有被及时接收,或者接收的长度不足一次发送的长度数据与数据之间没有边界本质:发送的每一条数据之间没有边界–例:importsocketsk=…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

粘包现象

当多条消息发送时接受变成了一条或者出现接收不准确的情况
粘包现象会发生在发送端
两条消息间隔时间短,长度短 就会把两条消息在发送之前就拼在一起
节省每一次发送消息回复的网络资源

粘包现象会发生在接收端
多条消息发送到缓存端,但没有被及时接收,或者接收的长度不足一次发送的长度
数据与数据之间没有边界

本质 : 发送的每一条数据之间没有边界

– 例:
import socket

sk = socket.socket()
sk.bind(('192.168.12.26',9001))
sk.listen()

conn,addr = sk.accept()
conn.send(b'hello'*300)
conn.send(b'world')

解决粘包

方法1:
server端:
import socket

sk = socket.socket()
sk.bind(('192.168.12.26',9001))
sk.listen()
conn,addr = sk.accept()
msg1 = b'hello'
msg2 = b'world'
len_msg = len(msg1)
str_len = str(len_msg)
proto_len = str_len.zfill(10)
conn.send(proto_len.encode())
conn.send(msg1)

len_msg = len(msg2)
str_len = str(len_msg)
proto_len = str_len.zfill(10)
conn.send(proto_len.encode())
conn.send(msg2)
client端:
import time
import socket

sk = socket.socket()

sk.connect(('192.168.12.26',9001))
for i in range(1000000):2*i
len_msg = sk.recv(10).decode('utf-8')
len_msg = int(len_msg)
msg1 = sk.recv(len_msg)
print(msg1)
len_msg = sk.recv(10).decode('utf-8')
len_msg = int(len_msg)
msg2 = sk.recv(len_msg)
print(msg2)
方法2:
server端:
import struct
import socket

def proto_send(msg):
    msg = msg.encode('utf-8')
    len_msg = len(msg)
    proto_len = struct.pack('i', len_msg)  # 把字节的长度编程4字节,i代表int
    conn.send(proto_len)
    conn.send(msg)

sk = socket.socket()
sk.bind(('192.168.12.26',9001))
sk.listen()

conn,addr = sk.accept()
msg1 = 'hello'
msg2 = 'world'
proto_send(msg1)
proto_send(msg2)

# 计算要发送的数据字节长度
# 把字节的长度编程4字节
# 发送4字节
# 发送数据

# 通过socket的tcp协议上传文件
client端:
import struct
import socket

sk = socket.socket()

def proto_recv():
    len_msg = sk.recv(4)
    len_msg = struct.unpack('i', len_msg)[0]
    msg = sk.recv(len_msg)
    return msg

sk.connect(('192.168.12.26',9001))
for i in range(1000000):2*i
msg1 = proto_recv()
print(msg1)
msg2 = proto_recv()
print(msg2)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169710.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 语义分割总结_细粒度语义分割

    语义分割总结_细粒度语义分割图像分割算法总结1.评价指标:普通指标:PixelAccuracy(PA,像素精度):标记正确的像素点占所有像素点的比例。混淆矩阵中=\(\frac{{\rm{对角线}}}{总和}\)Mea

    2022年8月5日
    5
  • Arduino 和LCD1602液晶屏 I2C接口实验「建议收藏」

    LCD1602液晶屏带I2C接口为什么使用I2C接口?因为省IO口啊,只需要4条线,可以看看之前发的实验,接线多复杂呀,对吧。(传送门:Arduino携手LCD1602向世界问好“helloWorld!”)还有背光灯,和可调节对比度(就是背面蓝色那块可以旋转的调)具体怎么实现解决问题,请往下看引脚说明GND——地线VC…

    2022年4月14日
    260
  • WSAStartup函数的用途

    我们先来看看WSAStartup函数的原型intPASCALFARWSAStartup(WORDwVersionRequired,LPWSADATAlpWSAData);    可以这么理解,第一个参数提供必要信息(为了加载套接字库),第二个参数获取相关信息(获取相关信息)。看看下面的程序就明白了(其中wVersion比较重要):          WSACl

    2022年4月7日
    55
  • 哈希算法 数据结构_实现哈希表构造和查找算法

    哈希算法 数据结构_实现哈希表构造和查找算法一、什么是哈希表1.概述哈希表(Hashtable,也叫散列表),是根据关键码值(Keyvalue)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找

    2022年8月16日
    3
  • IntelliJ IDEA 如何创建一个 Java 项目

    IntelliJ IDEA 如何创建一个 Java 项目一、创建Java项目1.选择一个文件夹,鼠标右击OpenFolderasIntellliJIDEAProject(作为intellijidea项目打开文件夹),打开之后应该是一个初始界面2.选择File—>New—>Project3.选择一个电脑本机的JDK4.NewProject:可以不勾选,直接NEXT5.选择新项目名称,新项目路径,然后Finsh,在新打开的页面选择NewWindow6.创建Java项目成功二、创建Java文件1.右击src—&gt

    2022年7月9日
    81
  • mpu6050计步原理_佳明速度传感器安装

    mpu6050计步原理_佳明速度传感器安装下面三部分内容包括:计步原理、基于MPU6050的计步实现、基于MPU6050的久坐检测实现,第一部分为转载内容,做东西最好要了解下关键部分的原理。一、计步原理以下转自:http://www.elecfans.com/yuanqijian/sensor/20170816539797.html1.先要摸清模型的特征目前,大部分设备都提供了可以检测各个方向的加速度传感器…

    2022年9月28日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号