python网络编程二

UDP:User Datagram Protocal 用户数据报协议 是 OSI/RM 模型中隶属于传输层的面向无连接的网络数据传输协议
UDP数据传输速度快,不保证可靠传输。
UDP 服务端开发步骤如下:
⚫ 引入依赖的模块
⚫ 定义服务器描述信息
⚫ 创建 U DP 套接字对象 并绑定主机
⚫ 消息循环:和连接进入的客户端之间发送 / 收取消息
⚫ 关闭连接,释放资源

代码如下:
服务端代码如下:

# 引入需要的包
import socket
# 定义服务器信息
HOST = ''
PORT = 9000
ADDRESS = (HOST, PORT)
BUFFER = 1024
# 创建UDP套接字对象
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定主机
udp_server.bind(ADDRESS)
print("udp server is starting, waiting for data....")
# 不需要监听
while True:
    # 接收数据
    msg, addr = udp_server.recvfrom(BUFFER)
    try:
        print("client:", addr, msg.decode("utf-8"))
    except:
        print("client:", addr, msg.decode("gbk"))
    # 发送数据
    info = input("请输入你要发送的数据:")
    udp_server.sendto(info.encode("utf-8"), addr)
# 服务器退出,先关套接字
udp_server.close()

客户端代码如下:

# 引入需要的包
import socket
# 定义连接信息
HOST = '192.168.13.38'
PORT = 9000
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, addr = udp_client.recvfrom(BUFFER)
    try:
        print(addr, " say : ", msg.decode("utf-8"))
    except:
        print(addr, " say : ", msg.decode("gbk"))

面向对象的连接(socketserver)
socketserver 是 python 中提供的一个可以用于面向对象服务端开发的一个高级模块,封装 了底层 socket 的大量操作实现,通过提供面向对象的操作方式简化程序开发
⚫ socketserver 模块
BaseServer        基础服务类型,包含核心功能
TCPServer/UDPServer TCP/UDP        服务类型
UnixStreamServer/UnixDatagramServer        面向文件的 TCP/UDP 服务类型 ForkingMixin/ThreadingMixin        核心派生线程类型 ForkingTCPServer/ForkingUDPServer        线程派生类型和 TCP/UDP 混合类型
ThreadingTCPServer/ThreadingUDPServer        同上
BaseRequestHandler        基础请求处理类型 StreamReqeustHandler/DatagramRequestHandler        面向连接/无连接的请求处理类型

基于 socketserver 的 TCP 服务端的编程开发
代码如下:

# 引入需要的模块
import socket
# 创建一个集合:用来存储连接的多个客户端
client_set = set()
# 定义服务器信息
HOST = ''
PORT = 22666
ADDRESS = (HOST, PORT)
BUFFERS = 1024
# 创建UDP服务器套接字并绑定当前主机
udp_server = socket.socket(socket.AF_INET,   socket.SOCK_DGRAM)
udp_server.bind(ADDRESS)
# 消息的转发
while True:
    # 接受一个客户端的消息
    recv_msg, client_addr = udp_server.recvfrom(BUFFERS)
    client_set.add(client_addr)
    # 转发给所有客户端
    for client in client_set:
        udp_server.sendto(recv_msg, client)

客户端代码如下:

# 引入需要的包
import socket
# 连接主机的信息
HOST = '192.168.13.38'
PORT = 22666
ADDRESS = (HOST, PORT)
BUFFER = 1024
# 定义套接字连接对象
udp_client = socket.socket(socket.AF_INET,  socket.SOCK_DGRAM)
# 定义登记信息消息
info = input("请输入你的昵称:")
udp_client.sendto(info.encode("utf-8"), ADDRESS)
while True:
    # 接受一次消息
    msg, addr = udp_client.recvfrom(BUFFER)
    print(addr, " say : ", msg.decode("utf-8"))
    # 发送消息
    info = input("消息:")
    udp_client.sendto(info.encode("UTF-8"), ADDRESS)

UDP与TCP面向对象的编程类似,不同的地方在与UDP导入的包与TCP不同UDP导入的包为:UDPServer 和 DatagramRequestHandler

你可能感兴趣的:(python网络编程二)