python UDP网络通信

2022-06-27 09:08:45

一、概念

UDP是面向消息的协议,如果通信是不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,例如:

  • 语言广播
  • 视频
  • TFTP(简单文件传送)
  • SNMP(简单网络管理协议)
  • RIP(路由信息协议,如报告股票市场、航空信息)
  • DNS(域名解析)

和TCP类似,使用UDP的通信双方也分为客户端和服务器。

相关函数:

s = socket.socket(AddressFamily,Type)

函数socket.socket创建一个socket,返回该socket的描述符,该函数带有俩个参数:

  • AddressFamily: 可以选择AF_INET(用于Internet进程间通信)或者AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET。
  • Type:套接字类型,可以是SOCK_STREAM(流式套接字,主要用于TCP协议)或者SOCK_DGRAM(数据包套接字,主要用于UDP协议)。

例如:创建TCP/IP套接字,如下

 tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

创建UDP/IP套接字,如下

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

创建完成后,生成一个socket对象,socket对象的主要方法如下表所示:
socket对象的内置方法

函数描述
s.bind()绑定地址(host,port)到套接字,在AF_INET下,以元组(host,port)的形式表示地址
s.listen()开始TCP监听。在backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分程序设置为5就可以了
s.accept()被动接收TCP客户端连接(阻塞式),等待连接的到来
s.connect()主动初始化TCP服务器连接,一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误
s.recv()接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略
s.send()发送TCP数据,将string中的数据发送到连接的套接字。返回值是发送的字节数量,该数量可能小于string的字节大小
s.sendall()完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败抛出异常
s.recvfrom接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址
s.sendto()发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元祖,指定远程地址。返回值是发送的字节数
s.close()关闭套接字

二、创建UDP服务器 udp_server.py

#1.创建UDP套接字
#2.绑定地址(host,port)到套接字 s.bind()
#3.收发数据 s.recvfrom() s.sendto()
#4.关闭服务器端套接字 s.close()

import socket

#1.创建UDP套接字
#2.绑定地址(host,port)到套接字  s.bind()
#3.收发数据 s.recvfrom()  s.sendto() 
#4.关闭服务器端套接字 s.close()

s= socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
host="192.168.1.112"
port=1000
s.bind((host,port))  #绑定地址(host,port)到套接字

#接收客户端传过来的数据
data,addr= s.recvfrom(1024)  #data是接收到的数据 addr是对方的地址 也就是发送方的地址#print(type(data))print("收到的数据为:",str(data))#print("addr",addr)

send_data=input("请输入要发送到客户端的数据:\n")
s.sendto(send_data.encode("gbk"),addr)
s.close()

三、创建UDP客户端 udp_client.py

#1.创建客户端套接字
#2.发送/接收数据
#3.关闭套接字

#1.创建客户端套接字
#2.发送/接收数据
#3.关闭套接字

import socket

#1.创建客户端套接字
s= socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#2.发送/接收数据
send_data=input("请输入要发送给服务器的数据:\n")
s.sendto(send_data.encode("gbk"),("192.168.1.112",1000))print("收到的数据为:",s.recv(1024).decode("gbk"))
s.close()

运行代码时同时打开俩个cmd,先运行服务器端(udp_server.py)代码,在运行客户端(udp_client.py)代码

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

  • 作者:w²大大
  • 原文链接:https://blog.csdn.net/qq_42585108/article/details/121403040
    更新时间:2022-06-27 09:08:45