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

在Python下进行UDP网络编程的教程

程序员文章站 2022-05-16 11:12:43
tcp是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对tcp,udp则是面向无连接的协议。 使用udp协议时,不需要建立连接,只需要知道对方的ip地址和端口号,...

tcp是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对tcp,udp则是面向无连接的协议。

使用udp协议时,不需要建立连接,只需要知道对方的ip地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。

虽然用udp传输数据不可靠,但它的优点是和tcp比,速度快,对于不要求可靠到达的数据,就可以使用udp协议。

我们来看看如何通过udp协议传输数据。和tcp类似,使用udp的通信双方也分为客户端和服务器。服务器首先需要绑定端口:

s = socket.socket(socket.af_inet, socket.sock_dgram)
# 绑定端口:
s.bind(('127.0.0.1', 9999))

创建socket时,sock_dgram指定了这个socket的类型是udp。绑定端口和tcp一样,但是不需要调用listen()方法,而是直接接收来自任何客户端的数据:

print 'bind udp on 9999...'
while true:
  # 接收数据:
  data, addr = s.recvfrom(1024)
  print 'received from %s:%s.' % addr
  s.sendto('hello, %s!' % data, addr)

recvfrom()方法返回数据和客户端的地址与端口,这样,服务器收到数据后,直接调用sendto()就可以把数据用udp发给客户端。

注意这里省掉了多线程,因为这个例子很简单。

客户端使用udp时,首先仍然创建基于udp的socket,然后,不需要调用connect(),直接通过sendto()给服务器发数据:

s = socket.socket(socket.af_inet, socket.sock_dgram)
for data in ['michael', 'tracy', 'sarah']:
  # 发送数据:
  s.sendto(data, ('127.0.0.1', 9999))
  # 接收数据:
  print s.recv(1024)
s.close()

从服务器接收数据仍然调用recv()方法。

仍然用两个命令行分别启动服务器和客户端测试,结果如下:

在Python下进行UDP网络编程的教程

小结

udp的使用与tcp类似,但是不需要建立连接。此外,服务器绑定udp端口和tcp端口互不冲突,也就是说,udp的9999端口与tcp的9999端口可以各自绑定。

源码参考:https://github.com/michaelliao/learn-python/tree/master/socket