粘包现象_光柱现象

粘包现象_光柱现象粘包现象当多条消息发送时接受变成了一条或者出现接收不准确的情况粘包现象会发生在发送端两条消息间隔时间短,长度短就会把两条消息在发送之前就拼在一起节省每一次发送消息回复的网络资源粘包现象会发生在接收端多条消息发送到缓存端,但没有被及时接收,或者接收的长度不足一次发送的长度数据与数据之间没有边界本质:发送的每一条数据之间没有边界–例: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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java打印当前日期

    java打印当前日期

    2021年7月16日
    76
  • 二总线-MBus_二总线与CAN对比

    二总线-MBus_二总线与CAN对比二总线的定义二总线是一种相对于四线系统(两根供电线路、两根通讯线路),将供电线与信号线合二为一,实现了信号和供电共用一个总线的技术。二总线节省了施工和线缆成本,给现场施工和后期维护带来了极大的便利。在消防,仪表,传感器,工业控制等领域广泛的应用。在时间的维度上最早且典型二总线技术就是M-BUS。M-BUSM-Bus(MeterBus)的开发是为了满足众多仪表的远程读数,例如每户的天然气表…

    2022年10月15日
    3
  • idea 2021.03激活码【在线注册码/序列号/破解码】

    idea 2021.03激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    58
  • ntp网络时间协议_ntp网络时间协议特性

    ntp网络时间协议_ntp网络时间协议特性NTP是网络时间协议(NetworkTimeProtocol),它是用来同步网络中各个计算机的时间的协议。  原理:NTP要提供准确的时间,就必须有准确的时间来源,那可以用格林尼治时间吗?答案是否定的。因为格林尼治时间是以地球自转为基础的时间计量系统,但是地球每天的自转是有些不规则的,而且正在缓慢加速,因此,格林尼治时间已经不再被作为标准时间使用。新的标准时间,是由原子钟报时的

    2022年10月12日
    2
  • KindEditor是一套很方便的html编译器插件

    KindEditor是一套很方便的html编译器插件

    2021年11月5日
    55
  • 签名设计一笔签步骤「建议收藏」

    签名设计一笔签步骤「建议收藏」首语:签名设计一笔签步骤,很多人都不会写艺术签名,其实,作为一个普通人,不会写是正常的,因为会设计的都是下过功夫的,今天就来给大家分享【签名设计一笔签步骤】,希望大家能够喜欢!签名设计一笔签步骤其实每个名字的签名步骤都是不一样的,特别是不一样的字都是有自己独特的写法的,所以,很难给大家都讲解了的,不过没关系,我找几个典型的来给大家设计做下示范,大家慢慢学习就行了。目录:1、设计签名工具的选择2、签名设计应该掌握的技巧方法3、视频演示4、具体的操作步骤5、注意事项正文:1、设计签名工具的

    2025年9月23日
    4

发表回复

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

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