网络编程之UDP协议(用户数据报协议)

5 篇文章 0 订阅
5 篇文章 0 订阅

目录

UDP传输方式

一、udp网络程序-发送、接收数据

二、绑定接口

1.发送端绑定接口

2.接收端绑定接口

三、UDP综合案例(UDP聊天室)

udp通信模型

 


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通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可,类似于生活中,"写信""

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值