Python高级编程day8UPD与黏包

单向数据传递:

建立一个服务端(如下图所示)

接着是客户端:

接着运行代码,还是先启动服务端,接着启动客户端

如果出现这种情况:

修改端口号即可:

同样的,客户端的端口号也要修改:

运行效果:

双向发送消息(单次)

#服务端给客户端发送数据

msg="你好呀,这是来自服务端的消息"

sk.sendto(msg.encode('utf-8'),cli_addr)

写入“服务端”

同样的,在“客户端”中写入:

msg,sever_addr=sk.recvfrom(1024)

print(msg.decode())

print(sever_addr)

运行效果:(服务端)

(客户端)

这里我将端口号从7000修改为8080,因为:

双向发送消息(多次)

While死循环:

客户端代码:

运行代码,还是先启动服务端,接着启动客户端

接着在“客户端”输入要发送的文本:

此时的“服务端”

这里输出的文本就是从客户端发送出来的。

同样的,服务端也可以输入消息文本:

按下回车键即可,再返回客户端查看。

此时如果我再建立一个新客户端,接着在从服务端向客户端发送消息:

哪一个会接收消息呢?

发现,原来的客户端没有接收,但是新建的客户端却接收到了数据。

这就暴露了UDP的一个问题:数据发送并不安全。

应用场景:QQ离线发送数据,只管发送,不管接收。

黏包

有一个小案例:

       写一个CS架构的软件,在客户端里面输入一个字符串。

        发送给服务端解析成一个命令执行,将执行结果发送给客户端 命令 把你原来点击鼠标的行为变成命令。

黏包现象:

         cmd:tasklist运行程序,这个命令的特点就是特别特别长

         当我们再去输入dir的时候就会发现 还是原来的那个命令的结果。

当我们打开cmd页面时:输入命令"dir",按下回车键。

此命令的作用是查看当前文件夹下的所有子文件。

现在尝试实现这个软件:

先写一个服务端,接着写一个客户端:

服务端.py

客户端.py

先运行服务端,再运行客户端:

此时返回到服务端:

成功接收数据,但是没有做出任何处理。

并且cmd(命令提示符)是可以循环处理各种命令的。

所以用while循环。

先运行服务端,再运行客户端:

此时服务端显示,连接成功。

客户端:输入命令"dir",按下回车键。

此时的服务端:

 

这样就实现了循环。

那么如何执行输入的命令符号呢???

这里我们创建一个目录,再写一个demo文件。

运行结果:

然后在输入:print(obj.stdout)

运行结果:

这个输出结果是需要转换的。修改代码如下所示:

print(obj.stdout.read().decode("gbk"))#gbk是字符的一种解码格式

再次运行的结果:

如果输入的命令是错误的:(参数输入的是"zmy")

print(obj.stderr.read().decode("gbk"))

运行结果:

这样的,将服务端与客户端的代码再次修改:

客户端:

运行结果:

客户端

服务端:

案例实现完毕。

4.1、tcp协议的特点

TCP协议是面向流的协议,在发送的数据传输的过程中还有缓存机制避免数据丢失

因为在连续发送小数据的时候、以及接收大小不符的时候都容易出现黏包现象

本质还是因为我们在接收数据的时候不知道发送的数据的长短

4.2、Nagle算法和面向流的通信特点

tcp协议内部有Nagle算法这个优化算法,

TCP(transport control protocol,传输控制协议)是面向连接的,面向的,提供高可靠性服务。

收发两端客户端服务器端)都要有一一成对的socket。

因此,发送端为了将多个发往接收端的包,更有效的发到对方。

使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。

这样,接收端就难于分辨出来了,必须提供科学的拆包机制。 即面向流的通信是无消息保护边界的。

对于空消息:tcp是基于数据流的,于是收发的消息不能为空,这就需要在客户端和服务端都添加空消息的处理机制,防止程序卡住。

而udp是基于数据报的,即便是你输入的是空内容(直接回车),也可以被发送。

udp协议会帮你封装上消息头发送过去。

可靠黏包的tcp协议:tcp的协议数据不会丢,没有收完包,下次接收,会继续上次继续接收。

己端总是在收到ack时才会清除缓冲区内容。数据是可靠的,但是会粘包。

 

黏包实例代码:

发送给服务端"ZmySir"两次,运行结果:

发现它们是粘在一起的。

解决方式:

不能大于或等于,否则无法解决黏包问题。

 

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

中国第一深情

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

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

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

打赏作者

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

抵扣说明:

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

余额充值