套接字部分粘包问题介绍

一:基于tcp协议通信的套接字(通信循环+链接循环)

                 由于之前写的套接字简单版本,只通信一次就结束了,所以此次借助while使整个通信能够循环起来,多次通信。如图1:

                 但是图1这种方式有一个bug,就是如果通信中客户端直接终止了,在Windows系统上服务端就会报错崩溃了,在linux系统上

                 则表现为一直是收空的状态。所以为处理这个bug,更新如图2。然后图2这种方式虽然解决了客户端异常终止,服务端不会抛

                 异常的问题,但是服务端也跟着一起结束了。所以为了服务端能够重新建立其它的链接,再次用while实现一个链接循环,从而使

                 服务端继续运行,如图3。至此,服务端已经可以对外一直提供服务,尽管此时还没有并发的效果。

 

二:模拟ssh实现远程执行命令:通过借助subprocess模块,实现远程执行命令,如图4,但是刚刚都是发送数据的数据量小于接收端的数据量限制的情况,

                 并不会有什么问题,但如果超过了限制,就有问题了,多出的部分就会残留下来,这就牵涉到了粘包问题。

 

三:粘包问题:所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。此外,发送方引起的粘包是

                        由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一个TCP段。若连续几次需要send的数据

                        都很少,通常TCP会根据优化算法把这些数据合成一个TCP段后一次发送出去,这样接收方就收到了粘包数据。所以,总结下来粘包

                        问题是tcp协议流式传输数据的方式导致的。

   

                      解决粘包问题的思路:每次执行完命令,在收命令结果的时候,都把这个命令结果完完整整的全部收完。这样下次再执行命令,再收

                                                         结果的时候,就是全新命令的结果了。也就是接收端能够精确地收干净每个数据包,没有任何残留。

                      为解决粘包问题,需要借助一个模块:struct模块:该模块可以把一个类型,如数字,转成固定长度的bytes。依托这个模块来实现解决

                                                  粘包的问题。

 

                      解决粘包问题终极版:如图5

     

 

                              

 

                        

     

                         

 

          

 

                     

 

 

 

          

              

 

 

 

 

 

 

                

转载于:https://www.cnblogs.com/duanxiangyang/p/9580093.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值