Python UDP和黏包 一起来学习进步吧

目录

1.UDP

2.黏包是什么?

2.1.解决黏包的方法有哪几种

2.2 struck

2.3  subprocess:使用字符串执行命令

2.4 stirp

3.send和recv原理

1.UDP

        UDP不需要监听,因为udp从来都不需要建立连接,并且udp不需要检验。在一开始只能够接收数据。

        包括服务端和客户端。

其中服务端:

import socket

# 1.创建udp对象
sk = socket.socket(type=socket.SOCK_DGRAM)

# 2.绑定地址和端口
sk.bind(("127.0.0.1", 9000))

while True:
    # 3.udp服务器,在一开始只能够接收数据?
    msg, cli_addr = sk.recvfrom(1024)
    print(msg.decode('utf-8'))
    print(cli_addr)

    # 发送消息
    msg1 = input("服务端给客户端发送的消息是?:")
    sk.sendto(msg1.encode('utf-8'), cli_addr)

# 4.关闭连接
sk.close()

客户端是:

import socket

# 1. 创建udp对象
cl = socket.socket(type=socket.SOCK_DGRAM)

while 1:
    # 2.发送数据  sendto(消息,(ip+port))
    msg = input("客户端给服务端发送消息是?:")
    cl.sendto(msg.encode('utf-8'), ("127.0.0.1", 9000))

    # 接收消息
    msg1, server_addr = cl.recvfrom(1024)
    print(msg1.decode('utf-8'))
    print(server_addr)
# 3.关闭连接
cl.close()

2.黏包是什么?

        当我们执行一条特别长的命令的时候, 你会发现你拿到的不是你需要的命令结果 而是上一条的残留叫做黏包

        黏包优化算法:tcp协议在发送数据时,由于发送的字符小时,使用优化算法,把多次间隔小,或者数据量小的数据,合并成大一个数据发送给服务端。

2.1.解决黏包的方法有哪几种

  1. 改时间:time.sleep(0.2)
  2. 修改服务端字符:

        把这个

​
data = conn.recv(1024).decode('utf-8')
data1 = conn.recv(1024).decode('utf-8')

​

         改为:

data = conn.recv(5).decode('utf-8')
data1 = conn.recv(5).decode('utf-8')

  

        dir:返回下面的子目录

        ipconfig:返回网络配置信息

        tasklist:拿到的执行程序

        

2.2 struck

struck:固定报头

            就是一个固定的值。

        打包:pack 

import struct
'''
pack 是指打包,
第一个参数是指打包类型,'i'是指int类型  's'是指字符串类型。
第二次参数是指:我们要传的参数。
1024,我要进行的数据打包的大小,不管你的数据量有多大,最后都会变成固定长度的:四个字节。
'''

struct.pack('i',1024)

rest = struct.pack('i',1024)
rest1 = struct.pack('i',10240)
print(len(rest))
print(len(rest1))

        解包:unpack

#解包:
import struct
'''

'''

struct.pack('i',1024)

rest = struct.pack('i',1024)
rest1 = struct.unpack('i',rest)[0]
print(rest1)

 使用报头需要注意的地方:

        一个是:报头要给到客户端 ,客户端才能解压这个报头

        另外一个:就是一定要发送真实数据 不然客户端是拿不到的

        

2.3  subprocess:使用字符串执行命令

import subprocess

'''
    subprocess.Popen里面有三个参数:是指当shell为True 相当于我们去启动cmd,来执行dir,
    这个字符串。
    如果前面的字符串是正确的就去打印: stdout=subprocess.PIPE
    如果前面的字符串是错误就去打印: stderr=subprocess.PIPE
    
'''
obj = subprocess.Popen("dir", shell=True,
                       stdout=subprocess.PIPE,  # 正确的结果
                       stderr=subprocess.PIPE  # 错误的结果
                       )

print(obj)
# windows使用 subprocess时候 解码用'gbk'解码。
print(obj.stdout.read().decode('gbk'))
# print(obj.stderr.read().decode('gbk'))

2.4 stirp

stirp原理:去掉字符串两边的空格。

3.send和recv原理

        客户端是发送消息send的,服务端是接受消息recv的。客户端发送消息是通过套接字进行的打包, 再通过网络协议进行处理,  网络协议进行跳取的时候会有一个缓冲区,到服务端后,在缓冲区进行解包,然后在服务端 recv接受。

谢谢大家请大家指导错误!

        

        

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨某人...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值