相比于TCP协议建立连接传输安全可靠,UDP仅仅负责发送数据,不建立连接,只需要知道IP地址和端口号,以数据包的方式传输数据(具体不了解什么是数据包的传输方式)。

这里区分一下TCP协议和UDP协议里面的接收数据和发送数据的两个方法:

TCP:s.recv(buffersize)方法只负责接收数据,需要传输的参数buffersize是一次性接收的数据大小尺寸,返回的数据也只是得到的字节类型的数据。s.send()传入的只有要发送的字节型数据信息。

UDP:s.recvform(buffrsize)方法同样需要传入接收数据的尺寸,但不同的是这个方法返回两个参数,一个是接收的数据,一个是发生者的IP地址与端口号信息。s.sendto()方法发送数据也是需要传入两个参数,一个是要发送的数据,一个是元组(里面是目标的IP地址与端口号)。

python UDP 发送8字节的float数据 python udp 发送数组_服务器端

 服务器端

import socket

#SOCL_DGRAM是以数据包来传输数据,不能保证数据的完整性。
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

#绑定IP地址和端口号,服务器端必须的操作
hostname = socket.gethostname()
s.bind((hostname,9999))

print("已绑定UDP在端口9999......")
#因为是UDP协议,就不需要监听listen,直接接收客户端的信息
while True:
    #套接字的这个方法recvfrom不但接收信息,还会收到客户端的IP地址和端口(在一个元组里)
    data,addr = s.recvfrom(1024)
    print(f"接收到从{addr}发来的信息{data}")
    s.sendto(b"Welcome",addr)#必须在接收到客户端信息之后,因为要获取到客户端的地址端口号信息

这里写的时候主要不要在while循环里写s.close()关闭套接字,因为这是一个循环,会一直等待客户端发送的信息,如果关闭套接字,就无法调用recvform()方法来接收数据了。

客户端

import socket

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

hostname = socket.gethostname()
s.sendto(b'Hello',(hostname,9999))
data,addr = s.recvfrom(1024)
print("从服务器获取到信息%s"%data.decode('utf-8'))

运行结果:首先启动服务器端,等待接收来自客户端的信息Hello后,服务器端就会打印出接收到的信息,然后由服务器端发送一条Welcome信息,之后客户端接收到信息Welcome。

服务器端运行截图:

python UDP 发送8字节的float数据 python udp 发送数组_服务器端_02

 客户端运行截图:

python UDP 发送8字节的float数据 python udp 发送数组_服务器端_03