python udp socket解决服务端响应时间长的指数退避算法

news/2024/5/18 13:38:57 标签: python, socket, UDP

UDP连接是一个不可靠的连接,也就是说,UDP通信过程中可能出现数据包丢失的情况,或者是服务端宕机后,客户端不知道服务端状态,仍然不停的访问服务端的情况。针对这一情况,UDP客户端必须选择一个等待时间,一旦超过这个时间间隔还未收到服务端的响应,就重新发送请求,若多次请求仍未收到服务端的响应,就认为服务端宕机。而且,由于数据丢包的主要原因在于网络拥塞,因此,客户端在等待时间内未收到服务端的应答,客户端重发不应该和上次一样,这样就会造成网络拥塞加剧,鉴于这种情况,客户端采用指数退避算法,使得重发数据包频率越来越低,逐渐的环境网络的拥塞。同时,如果客户端选择的等待时间不合理,如选择200毫秒,但是由于发送的请求可能200毫秒才能到达服务端,这时客户端在等待时间内永远都收不到服务端的应答报文,这时也需要调整等待时间。

为了模拟网络拥塞或者服务器宕机出现的丢包,在服务端使用random()随机drop客户端的请求。

服务端代码:

python">import socket
import random


def server(ipaddr, port):
    # 开启UDP服务
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((ipaddr, port))
    print('Listening at {0}'.format(s.getsockname()))
    while True:
        data, addr = s.recvfrom(1024)
        print('From {0} Data:{1}'.format(addr, data.decode()))
        info = '12345'
        # 一半的概率会丢失客户端的请求
        if random.random() < 0.5:
            print('Drop packet from {0}'.format(addr))
            continue
        s.sendto(info.encode(), addr)


if __name__ == '__main__':
    server('127.0.0.1', 12345)

对于客户端,调用套接字的settimeout()方法,设置等待时间。若多次请求超时,就会终止接收。

客户端代码:

python">import socket


def client(ipaddr, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 设置初始的客户端等待响应时间
    delay = 0.1
    while True:
        send_data = input('enter info:')
        s.sendto(send_data.encode(), (ipaddr, port))
        print('waiting up to {0} seconds for a reply'.format(delay))
        s.settimeout(delay)
        try:
            data, addr = s.recvfrom(1024)
            print('From {0} Data:{1}'.format(addr, data.decode()))
            if data:
                delay = 0.1
        except socket.timeout:
            # 每次超时后,需要动态调整等待时间,当等待时间大于2秒时,就认为服务端宕机
            delay *= 2
            if delay > 2.0:
                print('Server down')
                break
            else:
                continue


if __name__ == '__main__':
    client('127.0.0.1', 12345)

 


http://www.niftyadmin.cn/n/1220995.html

相关文章

extjs两行tbar的问题

知道每个panel都有一个tbar(top bar 上面工具栏) ,bbar(bottom bar 底部工具栏)下面为大家介绍下extjs的两个tbar问题&#xff0c;感兴趣的朋友可以参考下版本&#xff1a;extjs3.4 接触过extjs的同志们都知道每个panel都有一个tbar(top bar 上面工具栏) ,bbar(bottom bar 底部…

中国百佳产业集群名单

一、浙江省 温州鹿城区 1、中国皮鞋产业集群 2、中国打火机产业集群 温州龙湾区 3、中国人造革产业集群 瑞安市 4、中国汽车摩托车配件产业集群 5、中国休闲鞋产业集群 苍南县 6、中国印刷产业集群 温州瓯海区 7、中国锁具产业集群 乐清市 8、中国中低压电器产业集群 永嘉县 9、…

python Memcached用法示例

memcache是一套分布式的高速缓存系统&#xff0c;由LiveJournal的Brad Fitzpatrick开发&#xff0c;但目前被许多网站使用以提升网站的访问速度&#xff0c;尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。 MemCache的工作流程如下&#xff1a;先检查…

JAVA实现实用的ZIP压缩与解压

程序实现了ZIP压缩。共分为2部分 &#xff1a; 压缩&#xff08;compression&#xff09;与解压&#xff08;decompression&#xff09; 大致功能包括用了多态&#xff0c;递归等JAVA核心技术&#xff0c;可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源…

Mac 和 iOS 开发资源汇总

小引本文主要汇集一些苹果开发的资源&#xff0c;会经常更新&#xff0c;建议大家把这篇文章单独收藏(在浏览器中按**commandD**)。今天(2013年7约19日)收录了许多中文网站和博客。大家一定要去感受一下哦。如果大家有知道不错的站点&#xff0c;可以告诉我。目录1、苹果官方文…

基于Android的天气预报查询系统设计

早前模仿别人的做的一个APP&#xff0c;基于Android的天气预报设计&#xff0c;加上语音识别的功能&#xff0c;现在分享一下&#xff0c;希望可以给大家带来帮助。代码仓库&#xff1a;https://github.com/Yang-Jianlin/Hefeng-Xiyu 1 UI设计 1.1 城市选择界面设计 城市选择…

java实现当前页面保存为图片

方法一&#xff1a; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.io.File;import javax.imageio.ImageIO;/************************************************…

android模拟器meid修改

为什么80%的码农都做不了架构师&#xff1f;>>> http://blog.csdn.net/totogo2010/article/details/7734417 在.....\android_sdk\tools文件下找到emulator-arm.exe&#xff0c;使用UltraEdit文本编辑器打开&#xff0c;搜索CGSN关键字&#xff0c;把0000000000..…