欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python用UDP编写一个简单的通信实例

程序员文章站 2022-07-12 19:35:34
...

Python实现TCP通信的实例:https://blog.csdn.net/SenrendipityAl/article/details/103383706

UDP通信

UDP是面向无连接的协议,使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。优点是速度快,协议简单,而且由于UDP无需建立连接所以可支持广播发送等,但其缺点是无法保证数据可靠到达。

接下来我尝试用Python实现UDP协议的端对端通信。

UDP服务器

Socket函数原型及参数选择:

int socket(int domain, int type, int protocol)
socket(AF_INET/AF_INET6/AF_PACKET/AF_UNIX/ AF_LOCAL,SOCK_STREAM/SOCK_DGRAM/SOCK_SEQPACKET/SOCK_RAW,IPPROTO_TCP/IPPTOTO_UDP/IPPROTO_SCTP/IPPROTO_TIPCTCP)
# 导入套接字的包
import socket

# 创建UDP的套接字
# 在本程序中的参数选择如下:
# socket(IPv4网络通信, 数据报套接字, UDP传输协议)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 客户端IP和端口号
HOST = '127.0.0.1'
PORT = 9999
s.bind((HOST, PORT))

# 循环接收Client数据
while True:
    # 利用recvfrom()方法获取数据和客户端的信息
    data, addr = s.recvfrom(1024)
    print("Received from %s: %s" % (addr, data.decode('gb2312')))
    s.sendto('I got it!'.encode('gb2312'), addr)
输出结果

Python用UDP编写一个简单的通信实例

注意事项

需要注意的是,由于addr有两个元素,如下图:
Python用UDP编写一个简单的通信实例
所以在输出如若不加括号,则addr的第二个元素会在第二个%s处打印,导致输出不雅观。

UDP客户机

# 导入套接字的包
import socket

HOST = '127.0.0.1'
PORT = 9999

# 客户端使用UDP时,首先仍然创建基于UDP的Socket,然后,直接通过sendto()给服务器发数据
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
    print('Please input your data:')
    InputData = input('> ')

    # 发送数据
    s.sendto(InputData.encode('gb2312'), (HOST, PORT))
    # 接收数据
    ReceiveData = s.recv(1024)
    print(ReceiveData.decode('gb2312'))
输出结果

Python用UDP编写一个简单的通信实例

注意事项

由于传输数据时的数据格式为byte,所以在使用数据时需要进行数据格式的转换,本实例中采用encode()和decode()函数进行简易转换,且采用gb2312编码可以支持汉字信息。