UDP通信几乎不使用文件对象,因为他们往往不能为数据如何发送和接受提供足够的控制。下面是一个基本的UPD客户端:
1 #!/usr/bin/env python 2 import socket,sys 3 4 host = sys.argv[1] 5 textport = sys.argv[2] 6 7 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 8 try: 9 port = int(textport) 10 except ValueError: 11 port = socket.getservbyname(textport, 'udp') 12 13 s.connect((host, port)) 14 print "Enter data to transmit:" 15 data = sys.stdin.readline().strip() 16 s.sendall(data) 17 print "Looking for replies; press Ctrl-C or Ctrl-Break to stop." 18 while 1: 19 buf = s.recv(2048) 20 if not len(buf): 21 break 22 sys.stdout.write(buf)
这段程序发送一个udp信息包,接收一个udp信息包,并继续等候其他的(其他的永远也不会到达)。最后Ctrl-C来终止。
让我们来看看它和TCP的区别:
1.当socket被建立的时候,程序调用的是SOCK_DGRAM,而不是SOCK_STREAM,这会向操作系统表明socket将使用udp通信。
2.对socket.getservbyname()的调用寻找的是UDP端口号,端口号对于协议是特殊的,即一个TCP使用119端口,一个完全不同的UDP程序也可以使用这个端口号。
3.UDP程序无法探测到服务器什么时候发送完数据,因为其实这里没有实际的连接。对connect()的调用只是初始化一些内在的参数,同时,服务器也许不会返回任何数据,或者数据也许在传输过程中丢失,程序并没有只能判断这个问题。因此,当您结束等待传来的信息包时,您必须按下Ctrl-C.