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

由于UDP 服务器不是面向连接的,所以不用像TCP 服务器那样做那么多设置工作。事实上,并不用设置什么东西,直接等待进来的连接就好了。服务端的伪代码如下:

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

测试代码如下:

#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语句可以让运行的程序更优雅的退出。

客服端的伪代码如下:

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

测试代码如下:

#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核心编程》

转载请注明出处:http://www.xiaomastack.com/2014/07/11/pythonsocketudp/ 谢谢!

发表评论:

你的电子邮件地址将不会被公开.

36 ÷ 4 =