Python3 socket网络编程(四)-UDP
udp
UDP协议
UDP(user datagram protocol)的中文叫用户数据报协议,属于传输层。
UDP是面向非连接的协议,它不与对方建立连接,而是直接把我要发的数据报发给对方。所以UDP适用于一次传输数据量很少、对可靠性要求不高的或对实时性要求高的应用场景。
-
udp通信中,服务器客户端通信流程
-
udp通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可。
三、UDP控制台消息传输示例
服务器端:
from socket import *
from time import ctime
HOST = ''
PORT = 8888
BUFSIZ = 1024
ADDRESS = (HOST, PORT)
udpServerSocket = socket(AF_INET, SOCK_DGRAM)
udpServerSocket.bind(ADDRESS) # 绑定客户端口和地址
while True:
print("waiting for message...")
data, addr = udpServerSocket.recvfrom(BUFSIZ)
print("接收到数据:", data.decode('utf-8'))
content = '[%s] %s' % (bytes(ctime(), 'utf-8'), data.decode('utf-8'))
udpServerSocket.sendto(content.encode('utf-8'), addr)
print('...received from and returned to:', addr)
udpServerSocket.close()
客户端:
from socket import *
HOST = '127.0.0.1'
PORT = 8888
BUFSIZ = 1024
ADDRESS = (HOST, PORT)
udpClientSocket = socket(AF_INET, SOCK_DGRAM)
while True:
data = input('>')
if not data:
break
# 发送数据
udpClientSocket.sendto(data.encode('utf-8'), ADDRESS)
# 接收数据
data, ADDR = udpClientSocket.recvfrom(BUFSIZ)
if not data:
break
print("服务器端响应:", data.decode('utf-8'))
udpClientSocket.close()
以下为socket定义的常见常量:
socket 类型 |
描述 |
socket.AF_INET |
用于服务器与服务器之间的网络通信 |
socket.SOCK_STREAM |
基于TCP的流式socket通信 |
socket.SOCK_DGRAM |
基于UDP的数据报式socket通信 |
常用函数:
Socket 函数 |
描述 |
s.bind(address) |
将套接字绑定到地址,如果是在AF_INET下,则以无组的方式传入,如s.bind('192.168.1.1', 8080) |
s.recvfrom(bufsize[, flag]) |
接受UDP套接字的数据,返回值是元组tuple(data, addr)。其中data是包含接受数据的字符串,address是发送数据的套接字地址 |
s.sendto(string[, flag], address) |
发送UDP数据,将数据发送到套接字,address形式为tuple(ipaddr, port),指定远程地址发送,返回值是发送的字节数 |
s.close() |
关闭套接字 |
"""聊天小程序--单任务版(只能发一次回一次)""" import socket def set_receive_info(rece_info): rece_ip = input("请输入待接收方的ip:") rece_port = input("请输入待接收的端口号:") rece_info = (rece_ip, int(rece_port)) print("接收方主机%s记录成功" % str(rece_info)) return rece_info def send_message(udp_socket, rece_info): send_data = input("输入发送的数据:") udp_socket.sendto(send_data.encode(), rece_info) print('发送成功.....') def receive_message(udp_socket): rec_data = udp_socket.recvfrom(1024) print('接收到数据,正在解析....', rec_data) print("收到消息:%s" % rec_data[0].decode('gbk')) def main(): # 创建一个套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 为这个套接字绑定一个ip和端口号 udp_socket.bind(("192.168.206.1", 9999)) rece_info = '' # 待接收方的主机信息 while True: print("1.发送消息,2.接收消息,3.重置收信人,4.退出") num = input("请输入:") if num == "1": if rece_info == '': rece_info = set_receive_info(rece_info) send_message(udp_socket, rece_info) elif num == '2': receive_message(udp_socket) elif num == '4': break elif num == '3': rece_info = set_receive_info(rece_info) else: print('输入无效') # 关闭一个套接字 udp_socket.close() if __name__ == '__main__': main()