一:基于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