socket编程-UDP
UDP 特性
- UDP 对数据的安全性,是否完整顺序到底对方,对方是否接手没有严格要求,继承IP特性
- UDP 是面向无连接的,就像我们寄快递一样,我们只要把我们的送达地址写好,至于采用什么快递都无所谓
- UDP 是一个一个的发,一个一个的收,数据格式基于数据报(包含报头以及数据本身)
- UDP 是应用需要发,就会发送,不处理堵塞(不要把处理UDP程序写在主线程里面)
应用场景
- 广播和多播应用必须使用UDP,也就是 一对多的情况
- 简单的请求-应答应用程序可以使用UDP,对数据流,丢不丢包都没关系,就可以使用UDP
- 对于海量数据传输不应该使用UDP,对数据传输比较严格
- DNS、NFS、流媒体传输等等
UDP通信

UDP发送数据
1 创建套接字
2 绑定本地信息(IP和端口)
3 接受数据
4 打印数据
5 关闭套接字
6.如果程序运行时,没有绑定端口,那么操作系统会自动分配一个端口给程序。 而且同一端口,不能用两次。
import socket
# def main():
# # 创建一个udp套接字
# udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#
# # 发送数据
# send_data = '666'
# # encode
# # Windows gbk
# udp_socket.sendto(send_data.encode('gbk'), ('192.168.0.161', 7890))
#
# udp_socket.close()
def main():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 没有绑定的话 端口就是随机分配的
udp_socket.bind(("", 7890))
while True:
send_data = input('请输入要发送的数据:')
if send_data == 'exit':
break
send_data = send_data.encode('gbk')
udp_socket.sendto(send_data, ('192.168.0.161', 8080))
udp_socket.close()
if __name__ == '__main__':
main()
UDP接受数据
'''
UDP接收数据
1 创建套接字
2 绑定本地信息(IP和端口)
3 接受数据
4 打印数据
5 关闭套接字
'''
import socket
def main():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 不写ip 表示本机的任何一个ip
bind_addr = ('', 7789)
udp_socket.bind(bind_addr)
while True:
# 1024 表示本次接收的最大字节数
recv_data = udp_socket.recvfrom(1024)
# 元组 接收到的数据 (发送方的ip,端口)
# (b'1', ('192.168.0.161', 8080))
# print(recv_data)
recv = recv_data[0]
send_data = recv_data[1]
print("%s:%s" % (str(send_data), recv.decode('gbk')))
udp_socket.close()
if __name__ == '__main__':
main()
UDP实现简单聊天器
'''
聊天器
'''
import socket
def send_data(udp_socket):
"""发送数据"""
send_data = input('请输入要发送的数据:')
dest_ip = input('请输入要发送的IP:')
dest_port = int(input('请输入要发送的端口:'))
udp_socket.sendto(send_data.encode('gbk'), (dest_ip, dest_port))
def recv_data(udp_socket):
"""接收数据"""
recv_data = udp_socket.recvfrom(1024)
print("%s:%s" % (recv_data[1], recv_data[0].decode('gbk')))
def main():
# 创建套接字 同时接收发送数据
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定
udp_socket.bind(("", 7788))
while True:
# 发送
send_data(udp_socket)
# 接收
recv_data(udp_socket)
# udp_socket.close()
if __name__ == '__main__':
main()