栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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接受。

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

        

        

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1008176.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号