【卷二】网络三—UDP服务器与客户端

这是另一个类型的服务器/客户端,无连接的 UDP: (User Datagram Protocol) 用户数据报协议

参考: P58~P60

 

UDP 时间戳服务器

【时间戳 就是ctime()显示的内容】

 1 # coding: utf-8
 2 
 3 from socket import *
 4 from time import ctime
 5 
 6 # HOST: 主机, 变量为空表示可以使用任何可用的地址
 7 # PORT: 端口, 有效端口号范围是0~65535(1024以下的预留给了系统)
 8 # BUFSIZ: 缓冲区, 大小可选, 这里设置为1024B, 即 1KB
 9 HOST = ""
10 PORT = 21567
11 BUFSIZ = 1024
12 
13 ADDR = (HOST, PORT)
14 udpSerSock = socket(AF_INET, SOCK_DGRAM)
15 udpSerSock.bind(ADDR)
16 
17 # 由于UDP类型套接字的是不用连接的, 所以没有监听(ss.listen())
18 # 和让客户端转接到一个新的、独立的套接字的"转化"过程(ss.accept())
19  
20 while True:
21     print "Waiting for message..."
22     data, addr = udpSerSock.recvfrom(BUFSIZ)
23     udpSerSock.sendto("[%s] %s" % (ctime(), data), addr)
24     print "...received from and returned to:", addr
25 
26 udpSerSock.close()
Server

注意,HOST = "" 这里的双引号不能写成 " " 带空格的形式, 不然会出现如下错误!

UDP 客户端

 1 # coding: utf-8
 2 
 3 from socket import *
 4 
 5 # HOST:主机名, PORT:端口, 要和服务器的一样, 不然无法建立联系
 6 # PORT:端口, 同样可取0~65535(1024以下的预留给了系统)
 7 
 8 HOST = "localhost"
 9 PORT = 21567以下的
10 BUFSIZ = 1024
11 ADDR = (HOST, PORT)
12 
13 udpCliSock = socket(AF_INET, SOCK_DGRAM)
14 # 由于UDP套接字:(User Datagram Protocol)是不需要建立连接的, 所以
15 # 也就没有(cs.connet())的过程
16 
17 while True:
18     data = raw_input("> ")
19     if not data:
20         break
21     # 记得发送地址呀,不然服务器去哪找你呀,亲
22     udpCliSock.sendto(data, ADDR)
23     data, ADDR = udpCliSock.recvfrom(BUFSIZ)
24     print data
25 
26 udpCliSock.close()
Client-side

如果是这种错误,说明端口被占用了,可能是你在编辑器启动了服务器,然后你又在powershell里启

动了一个, 解决方法是换个端口,别再启动了,直接在控制台启动(powershell) !

错误2:服务器和客户端没有连接上,可能还没启动服务器就先启动客户端,或者是两者的端口或地址对不上

           比如: HOST(主机名)那里忘写本地主机了'localhost'

 

下面两幅图简单比较下 UDP 和 TCP 服务器/客户端

【左边是UDP,右边是TCP,注意: 右边的别遗漏了listen(),特别留意,缓冲区大小BUFSIZ不要漏了!】

        从上面可知,TCP服务器比UDP的多了一个while循环,这是为什么呢?其实主要是和 "if not data:"

有关,因为不加if语句的话,一旦客户端断开(如当下面的客户端执行raw_input()提示输入时,直接回车键

或用Ctrl+C引发键盘中断,之后的if,send语句自然也执行不了),那么将会引起服务器收不到("recv()")

而出错 !

        所以,既要服务器的 if 语句,又要保证不退出服务器,只能多加一个while循环 !

        而UDP服务器由于其套接字自带recv()方法, 不用再借助客户端的(不用与之连接),所以也就不用担

心客户端退出引起服务器出错......自然也就不用再多加一个while循环了 !

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

再来比较下客户端的异同:

 

posted @ 2016-08-27 14:40  坏小孩D_R  阅读(589)  评论(0编辑  收藏  举报