python网络编程【二】(使用UDP)

  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.

posted @ 2016-07-06 15:00  木落之年  阅读(1230)  评论(0编辑  收藏  举报