粘包现象_光柱现象

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


相关推荐

  • 手机发布版sha1怎么获取_androidstudio导出项目zip

    手机发布版sha1怎么获取_androidstudio导出项目zip申请key必须用发布版的SHA1及MD51.打包出来apk;2.将apk修改后缀为.rar文件后解压;3.进入解压后的META-INF目录,该目录下会存在文件CERT.RSA;4.在该目录下打开cmd,输入命令:keytool-printcert-fileCERT.RSA若提示输入密码,则输入android后回车…

    2022年8月10日
    3
  • Ubuntu 设置 WIFI 热点

    Ubuntu 设置 WIFI 热点

    2021年9月16日
    56
  • 文件上传-文件名长度绕过白名单限制[通俗易懂]

    文件上传-文件名长度绕过白名单限制[通俗易懂]  在实际***中,当我们发现有文件上传的地方时,我们会尽可能地尝试所有的办法进行webshell的上传,只要能上传webshell,就说明本次***至少成功了一半,后续就看获得的webshell的权限情况进行下一步的操作。对于文件上传漏洞的防护来说,主要分为以下两类:白名单限制和黑名单限制,对于黑名单的限制,我们只需要寻找一些较为偏僻的可执行后缀、大小写混写以及相关操作系统的特性(如windo…

    2022年10月19日
    0
  • 面试之ActiveMQ

    面试之ActiveMQ面试之ActiveMQ

    2022年4月23日
    42
  • springcloud版本号

    springcloud版本号因为SpringCloud不同其他独立项目,它拥有很多子项目的大项目。所以它是的版本是版本名+版本号,下面这些都是它的一些版本名:这些Angle,Brixton,Camden等都是伦敦地铁站的名字,他们按照字母顺序发行,就是版本的演进.当一个版本的SpringCloud项目的发布内容积累到临界点或者一个严重bug解决可用后,就会发布一个“servicereleases”版本,简称SR…

    2022年5月18日
    54
  • swoole源码安装步骤

    swoole源码安装步骤

    2022年2月12日
    39

发表回复

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

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