16.3.6 创建一个UDP服务器
由于UDP服务器不是面向连接的,所以不用像TCP服务器那样做那么多的设置工作。事实上,并不用设置什么东西,直接等待进来的连接就好了。
from socket import *
from time import ctime
HOST = ''
PORT = 12345
BUFSIZ = 1024
ADDR = (HOST, PORT)
udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR)
while True:
print 'waiting for message...'
data, addr = udpSerSock.recvfrom(BUFSIZ)
udpSerSock.sendto('[%s] %s' % (ctime(), data), addr)
print '...received from and returned to:', addr
udpSerSock.close()
UDP和TCP服务器的另一个重要区别是,由于数据报套接字是无连接的,所以无法把客户端连接交给另外的套接字进行后续的通讯。这些服务器只是接受消息,需要的话,给客户端返回一个结果就可以了。
UDP服务器被动地等待数据报消息的到来。当有消息进来时,就处理它,把结果返回去,然后等待下一个消息。
16.3.7 创建一个UDP客户端
UDP客户端的循环基本上与TCP客户端的完全一样。唯一的区别就是,我们不用先去跟UDP服务器建立连接,而是直接把消息发送出去,然后等待服务器的回复。
from socket import *
HOST = 'localhost'
PORT = 12345
BUFSIZ = 1024
ADDR = (HOST, PORT)
udpCliSock = socket(AF_INET, SOCK_DGRAM)
while True:
data = raw_input('> ')
if not data:
break
udpCliSock.sendto(data, ADDR)
data, ADDR = udpCliSock.recvfrom(BUFSIZ)
if not data:
break
print data
udpCliSock.close()
对于TCP服务器来说,由于客户端会创建一个连接,我们自然就能知道消息来自哪里。