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

忘是亡心i 2023-06-19 02:28 98阅读 0赞

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

UDP通信

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

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

UDP服务器

Socket函数原型及参数选择:

  1. int socket(int domain, int type, int protocol)
  2. socket(AF_INET/AF_INET6/AF_PACKET/AF_UNIX/ AF_LOCALSOCK_STREAM/SOCK_DGRAM/SOCK_SEQPACKET/SOCK_RAWIPPROTO_TCP/IPPTOTO_UDP/IPPROTO_SCTP/IPPROTO_TIPCTCP)
  3. # 导入套接字的包
  4. import socket
  5. # 创建UDP的套接字
  6. # 在本程序中的参数选择如下:
  7. # socket(IPv4网络通信, 数据报套接字, UDP传输协议)
  8. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  9. # 客户端IP和端口号
  10. HOST = '127.0.0.1'
  11. PORT = 9999
  12. s.bind((HOST, PORT))
  13. # 循环接收Client数据
  14. while True:
  15. # 利用recvfrom()方法获取数据和客户端的信息
  16. data, addr = s.recvfrom(1024)
  17. print("Received from %s: %s" % (addr, data.decode('gb2312')))
  18. s.sendto('I got it!'.encode('gb2312'), addr)
输出结果

Server输出结果

注意事项

需要注意的是,由于addr有两个元素,如下图:
addr的结构
所以在输出如若不加括号,则addr的第二个元素会在第二个%s处打印,导致输出不雅观。

UDP客户机

  1. # 导入套接字的包
  2. import socket
  3. HOST = '127.0.0.1'
  4. PORT = 9999
  5. # 客户端使用UDP时,首先仍然创建基于UDP的Socket,然后,直接通过sendto()给服务器发数据
  6. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  7. while True:
  8. print('Please input your data:')
  9. InputData = input('> ')
  10. # 发送数据
  11. s.sendto(InputData.encode('gb2312'), (HOST, PORT))
  12. # 接收数据
  13. ReceiveData = s.recv(1024)
  14. print(ReceiveData.decode('gb2312'))
输出结果

Client输出结果

注意事项

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

发表评论

表情:
评论列表 (有 0 条评论,98人围观)

还没有评论,来说两句吧...

相关阅读