在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()方法。
仍然用两个命令行分别启动服务器和客户端测试,结果如下:
小结
udp的使用与tcp类似,但是不需要建立连接。此外,服务器绑定udp端口和tcp端口互不冲突,也就是说,udp的9999端口与tcp的9999端口可以各自绑定。
源码参考:https://github.com/michaelliao/learn-python/tree/master/socket