1.UDP编程
1.1UDP概念
UDP:User 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()
试试看吧