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()

 

 
posted @ 2021-01-19 16:29  云long  阅读(189)  评论(0编辑  收藏  举报