python3 最简单的网络编程udp(socket数据包datagram)
UDP 不是基于连接的、是不连续的、 不可靠的、 效率⽐较⾼。 更像是寄信, 今⼉⼀封, 明⼉⼀封.,想啥时候发什么时候发。不管收件人收到还是没收到。
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。
服务器端
import socket sk = socket.socket(type=socket.SOCK_DGRAM) # 创建socket对象(udp类型) DGRAM数据包datagram sk.bind(("192.168.36.106", 8888)) # 绑定IP和端口 while 1: msg, address = sk.recvfrom(1024) # 接受客户端发来的消息,udp必须是客户端先发送消息 print(f"来自客户端的消息:{msg.decode('utf-8')}") if msg.decode("utf-8").upper() == "BYE": break sk.sendto(input(">>>:").strip().encode("utf-8"), address) # 发送消息 sk.close()
UDP服务端
1、导入socket模块
2、创建socket对象(UDP类型)
3、绑定IP地址和端口
4、接收来自客户端的消息
5、发送消息给客户端
6、关闭socket对象
客户端
import socket sk = socket.socket(type=socket.SOCK_DGRAM) # 创建socket对象(udp类型) while 1: sk.sendto(input(">>>:").strip().encode("utf-8"), ("192.168.36.106", 8888)) # udp必须是客户端先发送数据 msg, address = sk.recvfrom(1024) print(f"来自服务端的消息:{msg.decode('utf-8')}") if msg.decode("utf-8").upper() == "BYE": break sk.close()
UDP客户端
1、导入socket模块
2、创建socket对象(UDP类型)
3、发送消息给服务端
4、接收来自服务端的消息
5、关闭socket对象
注意:
1、先启动服务端,再启动客户端。
2、切记客户端先发送,服务端收到消息和客户端地址,才能给客户端发送消息。
为什么tcp和udp两种协议的端口可以相同?
操作系统当然有能力根据接受的报文的IP字段里面的协议部分判断这个报文是什么报文,就是说,系统读数据的时候还没有读到上层报文(TCP/UDP)的时候已经知道上层是什么报文了,直接交给相关的内核进程或协议栈处理就可以了。而在同一个协议内部端口号唯一。