模拟 停等协议 python 然后画出来效率

这个模拟的思路是:客户端给服务器传一个固定长度的数据流,这程序用的10个字节,服务器接受到后,要判断是否出错,这个出错的概率用的是随机数,在服务器端生成的一个随机数,当随机数大于8时判定为出错,此时给客户端返回这个随机数,这个客户端也知道这个8,也就知道服务器收到的是错的,客户端重传,然后服务器再判断,直到对为止。当这个随机数小于8时,就是成功了,服务器会将收到的这10个字节数据保存起来,并将这个随机数返回给客户端,客户端也就知道对了,然后会再读10个字节,传给服务器。

# todo socket server 编程 服务端
def test_socket_server():

    import socket
    import datetime
    import random

    # 建立一个服务端
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(('localhost', 9090))  # 绑定要监听的端口
    server.listen(5)  # 开始监听 表示可以使用五个链接排队
    conn, add = server.accept()  # 等待链接,多个链接的时候就会出现问题,其实返回了两个值
    f = open('/home/zh/local/classes/computerNetwork/test.txt', 'w')
    t1 = datetime.datetime.now()
    print(t1)
    while True:
        try:
            data = conn.recv(1024).decode()  #接收数据
            if data == "end":
                print("客户端关闭")
                break
            ack = random.randint(1, 10)
            if ack > 8:
                print("模拟出错接受到的不存入文件,并发送错误信号", ack)
                conn.send((str(ack)).encode("utf-8"))  # 然后再发送数据
            else:
                print('recive:@', data, "@存入文件")  # 打印接收到的数据
                if data != "":
                    f.write(data)
                conn.send((str(ack)).encode("utf-8"))  # 然后再发送数据
        except:
            conn.close()
            server.close()
            print("客户端断开了,服务器端也断")
            break
    conn.close()
    server.close()
    print("服务器关闭")

    t2 = datetime.datetime.now()
    print(t1)
    print(t2)
    t = t2 - t1
    print(t.total_seconds())

# todo socket client 编程 客户端
def test_socket_client():
    import socket
    # 客户端 发送一个数据,再接收一个数据

    client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)  # 声明socket类型,同时生成链接对象
    client.connect(('localhost', 9090))  # 建立一个链接,连接到本地的9090端口
    f = open('/home/zh/local/classes/computerNetwork/test2.txt', 'r+')
    data = '1'
    ch = ''
    while True:
        if int(data) > 8:
            print("模拟服务器没有接收到,反复发送直到成功接收")
            client.send(ch.encode('utf-8'))  # 发送一条信息 python3 只接收btye流
            data = client.recv(1024).decode()  # 接收一个信息,并指定接收的大小 为1024字节
            print("服务器端返回:", data)  # 输出我接收的信息
        else:
            try:
                ch = f.read(10)
                if not ch:
                    client.send("end".encode('utf-8'))  # 发送一条信息 python3 只接收btye流
                    break
                client.send(ch.encode('utf-8'))  # 发送一条信息 python3 只接收btye流
                data = client.recv(1024).decode()  # 接收一个信息,并指定接收的大小 为1024字节
                print("服务器端返回:", data)  # 输出我接收的信息
            except:
                print("服务器断开连接了,客户端也断开")
                client.close()  # 关闭这个链接
                break
    client.close()  # 关闭这个链接
    print("客户端断开链接")
# todo 画折线图
def draw_picture():
    # import datetime
    # t1 = datetime.datetime(2019, 10, 21, 22, 19, 11)
    # print(t1)
    # t2 = datetime.datetime.now()
    # print(t2)
    # t = t2 - t1
    # print(t.total_seconds())

    import matplotlib.pyplot as plt

    x = [5, 10, 15, 20,
         25,
         30,
         35,
         40,
         45,
         50,

         55
         ]

    y = [2.219706, 1.091734, 0.688127, 0.520746,
         0.423051,
         0.351719,
         0.311394,
         0.265771,
         0.258531,
         0.214895,

         0.219492

         ]

    # x=[
    #     90,
    #     80,
    #     70,
    #     60,
    #     50,
    #     40,
    #     30,
    #     20,
    #     10
    # ]
    #
    # y=[
    #     6.315903,
    #     3.197172,
    #     2.146958,
    #     1.625612,
    #     1.327782,
    #
    #     1.122105,
    #     0.927034,
    #     0.799626,
    #     0.819249,
    # ]

    plt.plot(x, y, 'ko')  # 点线
    plt.plot(x, y, 'k')

    # 同一文件不同包大小
    plt.title('Performance Curve of different packet')
    plt.ylabel('time / s')
    plt.xlabel('packet / bit')

    # 同一文件不同出错概率
    # plt.title('Performance Curve of different error probability')
    # plt.ylabel('time/s')
    # plt.xlabel('error probability / %')

    # plt.ylabel('time/ms')
    # plt.xlabel('packet/bit')
    plt.show()
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值