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))