目录
UDP传输方式
UDP 协议全称是用户数据报协议, 在网络中它与TCP协议一样用于处理数据包, 是一种无连接的协议.
选择 UDP 必须要谨慎, 在网络质量令人十分不满意的环境下, UDP协议数据包丢失会比较严重. 但是由于UDP的特性: 它不属于连接型协议, 因而具有资源消耗小, 处理速度快的优点. 所以通常音频、视频和普通数据在传送时使用 UDP 较多,因为它们即使偶尔丢失一两个数据包, 也不会对接收结果产生太大影响.
一、udp网络程序-发送、接收数据
# 导入套接字模块socket
import socket
# 创建socket对象
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口号
addr = ("", 6666)
udp_socket.bind(addr)
# 发送的内容
send_str = input("请输入发送信息:")
# 对方ip和端口号
send_ip = input("请输入对方ip:")
send_port = int(input("请输入对方端口号:"))
# 发送信息
udp_socket.sendto(send_str.encode(), (send_ip, send_port))
# 接收信息
# 返回值:元组 第一个是二进制的内容 第二个是对方ip和端口号
recv_tuple = udp_socket.recvfrom(1024)
# 讲二进制内容进行解码 由于发送过来的内容默认是gbk 所以要用gbk解码
recv_over = recv_tuple[0].decode()
# 输出内容
print(recv_over)
# 关闭socket
udp_socket.close()
二、绑定接口
1.发送端绑定接口
因为在一台电脑上运行的网络程序有很多,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp客户端的端口号一般不绑定
但是服务端的端口号一般是绑定的,如果报警电话每天都在变,想必世界就会乱了,所以一般服务性的程序,往往需要一个固定的端口号,这就是所谓的端口绑定
方法如下:
import socket
# 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# ip地址 端口号
addr = ("192.168.31.122", 7890)
# 发送端绑定,绑定发送端的ip和端口
# 发送端一定要绑定ip和端口吗?
udp_socket.bind(addr)
# 发送数据
udp_socket.sendto("hello".encode(), ("192.168.31.167", 8080))
# 关闭套接字
udp_socket.close()
2.接收端绑定接口
服务端的端口号一般是绑定的,如果报警电话每天都在变,想必世界就会乱了,所以一般服务性的程序,往往需要一个固定的端口号,这就是所谓的端口绑定
方法如下
# 1.导入模块
import socket
# 2.创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定接口 绑定主机中的8080端口 包括所有ip的8080端口
udp_socket.bind(("", 8080))
# 3.接收数据
recv_data, ip_port = udp_socket.recvfrom(1024)
print("接收的信息:", recv_data.decode())
# 4.关闭套接字
udp_socket.close()
三、UDP综合案例(UDP聊天室)
代码如下:
import socket
def show():
"""功能显示方法"""
print("*" * 50)
print("1.发送信息")
print("2.接受信息")
print("3.退出程序")
print("*" * 50)
def send_msg(udp_socket):
"""发送信息方法"""
ipaddr = input("请输入对方ip:")
# 如果没输入ip 使用默认ip
if len(ipaddr) == 0:
# 默认ip
ipaddr = '192.168.99.107'
print("默认设置为:%s" % ipaddr)
port = input("请输入对方端口号:")
# 如果没输入端口号 使用默认端口号
if len(port) == 0:
port = 8080
print("默认设置为:%s" % port)
# 输入发送的内容
content = input("请输入发送内容:")
# 进行发送
udp_socket.sendto(content.encode(), (ipaddr, int(port)))
def recv_msg(udp_socket):
"""接收信息方法"""
# 接收的是一个元组
recv_content = udp_socket.recvfrom(1024)
# 元组第一个是内容
re_content = recv_content[0].decode()
print(re_content)
def main():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口号
addr = ('', 6666)
udp_socket.bind(addr)
flag = 0
while True:
show()
num1 = input("请输入功能模块:")
if num1 == "1":
send_msg(udp_socket)
elif num1 == "2":
recv_msg(udp_socket)
elif num1 == "3":
print("退出成功")
break
else:
print("输出错误,请重新输入")
if __name__ == '__main__':
main()
udp通信模型
udp通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可,类似于生活中,"写信""