一个基于UDP协议的简单客户/服务器架构

由于UDP服务器不是面向连接的,所以不用像TCP 服务端需要做很多设置工作。
服务端伪代码:

1
2
3
4
5
ss = socket() # 创建一个服务器套接字 
ss.bind() # 绑定服务器套接字
inf_loop: # 服务器无限循环
cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送)
ss.close() # 关闭服务器套接字

服务端实现测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#coding=utf-8 
#/usr/bin/python
from socket import *
from time import ctime
host = ''
port = 64444
bufsiz = 1024
addr = (host, port)
try:
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
except EOFError:
udpSerSock.close()
except KeyboardInterrupt:
udpSerSock.close()
except:
udpSerSock.close()

try...except语句可以让运行的程序更优雅的退出。
客服端的伪代码:

1
2
3
4
cs = socket() # 创建客户套接字 
comm_loop: # 通讯循环
cs.sendto()/cs.recvfrom() # 对话(发送/接收)
cs.close() # 关闭客户套接字

客户端实现测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#coding=utf-8 
#!/usr/bin/python
from socket import *
host = '192.168.5.254'
port = 64444
bufsiz = 1024
addr = (host, port)
try:
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
except EOFError:
udpCliSock.close()
except KeyboardInterrupt:
udpCliSock.close()
except:
udpcliSock.close()

同样使用了try...except语句是让程序更优雅的退出,代码参考《Python核心编程》

----------------本文结束 感谢阅读----------------