创建UDP连接

创建UDP连接

在 socket 对象中,使用方法 recvfrom() 接收数据。具体语法格式如下:

recvfrom(bufsize[,flags]) #bufsize用于指定缓冲区大小

方法 recvfrom() 主要用来从 socket 接收数据,可以连接 UDP。

在 socket 对象中,使用方法 sendto() 发送数据。具体语法格式如下:

sendto (bytes, address)

参数“bytes”表示要发送的数据;参数“address”表示发送信息的目标地址。由目标IP地址和端口构成的元组,主要用来通过 UDP 将数据发送到指定的服务器端。

服务端

在 Python 程序中,UDP 服务器不需要 TCP 服务器那么多的设置,因为它们不是面向连接的。除等待传入的连接之外,几乎不需要做其他工作。

下面是一段通用的 UDP 服务器端代码。

ss = socket() #创建服务器套接字
ss.bind() #绑定服务器套接字
infloop: #服务器无限循环
    cs = ss.recvfrom()/ss.sendto() #实现对话操作(接收/发送)
ss.close() #关闭服务器套接字

从上述演示代码中可以知道,除创建套接字并将它绑定到本地地址(主机名/端口号对)之外,并没有额外的工作。无限循环包含接收客户端消息、打上时间戳并返回消息,然后回到等待另一条消息的状态。注意,close() 调用是可选的,并且由于无限循环的缘故,它并不会被调用,但它应该是优雅或智能退出方案的一部分。

下面的实例代码中演示了使用套接字建立 UDP“客户端/服务器端”连接的过程,UDP 是一个不可靠的、相互通信的“客户端/服务器端”。

实例文件 serudp.py 的功能是使用 UDP 连接方式建立一个服务器端程序,将收到的信息直接发回客户端。文件 serudp.py 的具体实现代码如下:

import socket #导入socket模块
HOST = '' #定义变量HOST的初始值
PORT = 10000  #定义变量PORT的初始值
#创建socket对象s,参数分别表示地址和协议类型
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((HOST, PORT)) #将套接字与地址绑定
data = True #设置变量data的初始值
while data: #如果有数据
    data,address = s.recvfrom(1024) #实现对话操作(接收/发送)
    if data==b'zaijian': #当接收的数据是zaijian时
        break #停止循环
    print('接收信息:',data.decode('utf-8')) #显示接收到的信息
    s.sendto(data,address) #发送信息
s.close() #关闭连接

在上述实例代码中,建立 UDP 连接之后,使用 while 语句多次与客户端进行数据交换。上述服务器程序建立在本机的 10000 端口上,当收到“zaijian”信息时退出 while 循环,关闭服务器。

客户端

import socket #导入socket模块
HOST = 'localhost' #定义变量HOST的初始值
PORT = 10000 #定义变量PORT的初始值
#创建socket对象s,参数分别表示地址和协议类型
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data = "你好!" #定义变量data的初始值
while data: #如果有data数据
    s.sendto(data.encode('utf-8'),(HOST,PORT)) #发送数据信息
    if data=='zaijian': #如果data的值是'zaijian'
        break #停止循环
    data,addr = s.recvfrom(512) #读取数据信息
    print("从服务器接收信息:\n",data.decode('utf-8')) #显示从服务器端接收的信息
    data = input('输入信息:\n') #信息输入
s.close() #关闭连接

上述代码使用套接字以 UDP 连接方式建立了一个简单的客户端程序,当在客户端创建套接字后,会直接向服务器端(本机的 10000 端口)发送数据,而没有进行连接。当用户键入“zaijian”时退出 while 循环,关闭本程序。运行效果与 TCP 服务器端和客户端实例基本相同。

posted @ 2022-10-31 10:25  春游去动物园  阅读(340)  评论(0编辑  收藏  举报