'''recv与recvfrom的区别及基于udp实现ntp服务'''
from socket import *
'''服务端'''
ip_port = ('127.0.0.1', 8080)
buffer_size = 1024
udp_server = socket(AF_INET, SOCK_DGRAM)
udp_server.bind(ip_port)
#
# while True:
# data, addr = udp_server.recvfrom(buffer_size) # 可以收到为空的消息
# print(data)
# # msg = input('请输入:')
# udp_server.sendto(data.upper(), addr)
#
# udp_server.close()
# 因为udp没有建立链接这么一说,所以就这样也可以实现并发的效果,多个客户端链接并发送消息都可以处理,而tcp一次只能处理一个
'''ntp服务'''
import time
while True:
data, addr = udp_server.recvfrom(buffer_size)
if not data:
fmt = '%Y-%m-%d %X'
else:
fmt = data.decode('utf-8')
back_time = time.strftime(fmt) # 输入只要是符合%Y %m %d %X就都可以返回对应的时间及格式
udp_server.sendto(back_time.encode('utf-8'), addr) # 如果数据类型为整型或浮点型,必须先转为字符串,然后再进行编码
udp_server.close()
from socket import *
'''客户端'''
ip_port = ('127.0.0.1', 8080)
buffer_size = 1024
udp_client = socket(AF_INET, SOCK_DGRAM)
# while True:
# msg = input('请输入:').strip() # 输入为空时,服务端能收到一个为空的消息,服务端也发送给了一个为空转成大写(也是为空)的消息给客户端;而tcp会阻塞
# udp_client.sendto(msg.encode('utf-8'), ip_port)
# data, addr = udp_client.recvfrom(buffer_size)
# print(data)
#
# udp_client.close()
'''ntp服务'''
while True:
msg = input('请输入:').strip()
udp_client.sendto(msg.encode('utf-8'), ip_port)
data, addr = udp_client.recvfrom(buffer_size)
print(data.decode('utf-8'))
udp_client.close()
from socket import *
'''客户端1'''
ip_port = ('127.0.0.1', 8080)
buffer_size = 1024
udp_client = socket(AF_INET, SOCK_DGRAM)
# while True:
# msg = input('请输入:').strip() # 输入为空时,服务端能收到一个为空的消息,服务端也发送给了一个为空转成大写(也是为空)的消息给客户端;而tcp会阻塞
# udp_client.sendto(msg.encode('utf-8'), ip_port)
# data, addr = udp_client.recvfrom(buffer_size)
# print(data)
#
# udp_client.close()
'''ntp服务'''
while True:
msg = input('请输入:').strip()
udp_client.sendto(msg.encode('utf-8'), ip_port)
data, addr = udp_client.recvfrom(buffer_size)
print(data.decode('utf-8'))
udp_client.close()