《云计算全栈》-python篇:创建UDP时间戳服务器、创建UDP时间戳客户端

4 案例4:创建UDP时间戳服务器
4.1 问题

创建udp_time_serv.py脚本,编写一个UDP服务器:

服务器监听在0.0.0.0的21567端口上
收到客户端数据后,将其加上时间戳后回送给客户端

4.2 方案

UDP的通信与TCP相类似,使用UDP的通信双方也分为客户端和服务器,服务器首先需要创建Socket对象,设置socket选项,服务器要绑定一个端口接收来自客户端的数据,并向该客户端发送数据。

需要注意的是:

1.UDP则是面向无连接的协议。只要数据发送出去。无需去管对方是否接收到。使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就无法确定了。

2.虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。

服务器端流程如下:

1.创建socket对象,用SOCK_DGRAM指定Socket的类型是UDP

2.设置socket选项,当socket关闭后,本地端用于该socket的端口号立刻就可以被重用。

3.绑定端口及ip地址

4.接收数据 自动阻塞 等待客户端请求

5.发送数据给客户端

recvfrom()方法可以返回数据和客户端的地址与端口,这样,服务器收到数据后,直接调用sendto()就可以把数据用UDP发给客户端。
4.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:编写脚本

    [root@localhost day08]# vim udp_time_serv.py
    #!/usr/bin/env python3
    import socket
    import time
    host = '0.0.0.0'
    port = 21567
    addr = (host, port)
    # SOCK_DGRAM指定了这个Socket的类型是UDP
    s = socket.socket(type=socket.SOCK_DGRAM)
    #设置socket选项,当socket关闭后,本地端用于该socket的端口号立刻就可以被重用。
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    #绑定 客户端口和地址:
    s.bind(addr)
    while True:
    #接收数据 自动阻塞 等待客户端请求:
        data, cli_addr = s.recvfrom(1024)
        data = str(data, encoding='utf8')
        if data.strip() == '':
            break
        data = '[%s] %s' % (time.strftime('%H:%M:%d'),data)
        print(data)
        s.sendto(bytes(data,encoding='utf8'), cli_addr)
    s.close() 

步骤二:测试脚本执行

[root@localhost day08]# python3 udp_time_serv.py 
[15:41:25] nihao
[15:41:25] how are you?
[15:42:25] I'm fine,thank you
[15:50:25] hello

5 案例5:创建UDP时间戳客户端
5.1 问题

创建udp_time_client.py脚本,编写一个UDP客户端:

连接服务器的21567
接收用户从键盘上的输入
发送接收到的字符串给服务器
如果用户按ctrl + c则退出程序

5.2 方案

客户端使用UDP时,首先仍然创建基于UDP的Socket,然后,不需要调用connect(),直接通过sendto()给服务器发数据,通过recvfrom()接收数据

客户端流程如下:

1.创建socket对象,用SOCK_DGRAM指定Socket的类型是UDP

2.发送数据给服务器端口及ip地址

3.接收服务器端数据
5.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:编写脚本

    [root@localhost day08]# vim udp_time_client.py
    #!/usr/bin/env python3
    import socket
    host = '127.0.0.1'
    port = 12345
    addr = (host, port)
    #创建套接字
    c = socket.socket(type=socket.SOCK_DGRAM)
    data=input(">:")
    #发送数据
    c.sendto(bytes(data,"utf-8"), addr)
    #接收数据
    print(c.recvfrom(1024))
    c.close()

步骤二:测试脚本执行

[root@localhost day08]# python3 udp_time_client.py
>:nihao
(b'[15:41:25] nihao', ('127.0.0.1', 12345))
[root@localhost day08]# python3 udp_time_client.py
>:how are you?
(b'[15:41:25] how are you?', ('127.0.0.1', 12345))
[root@localhost day08]# python3 udp_time_client.py
>:I'm fine,thank you
(b"[15:42:25] I'm fine,thank you", ('127.0.0.1', 12345))
[root@localhost day08]# python3 udp_time_client.py
>:hello  
(b'[15:50:25] hello', ('127.0.0.1', 12345))
发布了275 篇原创文章 · 获赞 46 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xie_qi_chao/article/details/104726288