python3.6 环境下的UDP网络编程

1.UDP编程

1.1UDP概念

UDPUser Datagram Protocal 用户数据报协议
OSI/RM 模型中隶属于传输层的面向无连接的网络数据传输协议
UDP 协议本身没有连接可靠性的保证,没有数据顺序 ACK 记录,没有数据重发等机制,因 为没有那么多的数据传输控制特性,所以 UDP 进行数据传输过程中延迟较小,数据传输效率较高,比较适合对可靠性要求不是很高的程序!

由于 UDP 面向无连接的特性,在编程处理的过程中,服务端和客户端的操作模式类似唯一的区别就是服务端需要主动等待客户端发送消息,要将自己的 AF 暴露给客户端操作 (回合制 : 一问一答)

1.2UDP服务端开发

UDP 服务端开发步骤如下:
⚫ 引入依赖的模块
⚫ 定义服务器描述信息
⚫ 创建 UDP套接字对象 并绑定主机
⚫ 消息循环:和连接进入的客户端之间发送 / 收取消息
⚫ 关闭连接,释放资源
源代码如下:

"""
udp服务端开发
version 1.1.0
author lkk
email lkk199404@163.com

"""

import socket  #导入所要用到的模块
#初始化服务器信息
HOST = ''
PORT = 8888  #设置IP以及端口信息
ADDRESS = (HOST, PORT)
BUFFER = 1024
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 创建udp套接字对象
udp_server.bind(ADDRESS) # 绑定目标主机
print('等待客户端连接>>>')
while True:
   msg, addr = udp_server.recvfrom(BUFFER)    #  接受消息,同时获取客户端 地址
   print('客户端{}:连接成功'.format(addr))
   try:  # 异常处理(针对不同编码的异常处理)
       print('客户端:', addr, msg.decode('utf-8'))
   except:
       print('客户端:', addr, msg.decode('gbk'))
#发送数据
   info = input('服务端:')
   udp_server.sendto(info.encode('utf-8'), addr)
udp_server.close()

运行结果在这里插入图片描述

1.3UDP客户端开发

客户端的开发更加简单,只需要明确目标主机信息 就可以完成和目标主机之间的消息发送/收取
UDP 客户端端开发步骤如下:
⚫ 引入依赖的模块
⚫定义目标主机信息
⚫创建套接字
⚫消息循环发送/接收数据
⚫关闭连接,释放资源
源代码如下:

"""
udp服务端开发
version 1.1.0
author lkk
email lkk199404@163.com
"""
import socket

HOST = '192.168.11.203'
PORT = 8888
ADDRESS = (HOST, PORT)
BUFFER = 1024

udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
    # 发送消息
    info = input('客户端:')
    udp_client.sendto(info.encode('utf-8'), ADDRESS)

    if info == 'bye':
        udp_client.close()
        break

#     接收信息
    msg, add = udp_client.recvfrom(BUFFER)
    try:
        print('服务端:', msg.decode('utf-8'))
    except:
        print('服务端:', msg.decode('gbk'))

运行结果:
客户端输入用户昵称
在这里插入图片描述
查看客户端提示连接成功
在这里插入图片描述

2.UDP案例开发

2.1简易聊天室

服务端源代码如下:

"""
UDP完整版聊天室端对端开发(服务端)
version 1.1.0
author lkk
Email lkk199404@163.com

"""
"""
UDP完整版聊天室端对端开发
version 1.1.0
author lkk
Email lkk199404@163.com

"""

import socket,threading

HOST = ''
PORT = 8666
ADDRESS = (HOST, PORT)
BUFFER = 1024

udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print('绑定目标主机')
udp_server.bind(ADDRESS)

print('等待客户端连接>>>')


def server_accept():
    while True:
        msg, addr = udp_server.recvfrom(BUFFER)
        print('客户端{}:连接成功'.format(addr))
        try:
            print('客户端:', addr, msg.decode('utf-8'))
        except:
            print('客户端:', addr, msg.decode('gbk'))


def server_send():
    while True:
        #发送数据

        info = input('服务端:')
        udp_server.sendto(info.encode('utf-8'))

    udp_server.close()


if __name__ == "__main__":
    S1 = threading.Thread(target=server_accept, args=(udp_server,))
    S2 = threading.Thread(target=server_send(), args=(udp_server,))

    S1.start()
    S2.start()

客户端源代码如下:

"""
UDP完整版聊天室端对端开发(客户端)
version 1.1.0
author lkk
Email  lkk199404@163.com

"""
import socket,threading

HOST = '192.168.11.203'
PORT = 8888
ADDRESS = (HOST, PORT)
BUFFER = 1024

udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


def client_send(udp_client):
    while True:
        # 发送消息
        info = input('客户端:')
        udp_client.sendto(info.encode('utf-8'), ADDRESS)

        if info == 'bye':
            udp_client.close()
            break
        # 接收信息
        msg, addr = udp_client.recvfrom(BUFFER)
        try:
            print('服务端:', msg.decode('utf-8'))
        except:
            print('服务端:', msg.decode('gbk'))


if __name__ == "__main__":
    # S1 = threading.Thread(target=client_accept, args=(udp_client,))
    S2 = threading.Thread(target=client_send, args=(udp_client,))

    # S1.start()
    S2.start()

试试看吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值