参考http://my.oschina.net/u/1433482/blog/190612
参考http://fantefei.blog.51cto.com/2229719/1282377
服务器类型
5种类型:BaseServer,TCPServer,UnixStreamServer,UDPServer,UnixDatagramServer。 注意:BaseServer不直接对外服务。
服务器对象
下面方法可以被子类重载,它们对服务器对象的外部用户没有影响。
处理器接收数据并决定如何操作。它负责在socket层之上实现协议(i.e., HTTP, XML-RPC, or AMQP),读取数据,处理并写反应。可以重载的方法如下:
[root@python day5]# cat tcpserver.py
#!/usr/bin/env python
import SocketServer,time
import sys
class Myserver(SocketServer.BaseRequestHandler):
#定义了一个用户信息字典,key是用户名,value是密码
userinfo = {'fan':'123','te':'234','fei':'345'}
def handle(self):
print 'Now connect from ', self.client_address[0]
while True:
#循环接收客户端发来的数据
recvdata = self.request.recv(1024)
if not recvdata:
continue
elif recvdata == 'Now client connect to Server':
self.request.sendall('OK,I am ready')
#如果数据是以username开头
elif recvdata.startswith('username'):
#以:为分隔符,取出最后一段赋值给self.username
self.username = recvdata.split(':')[-1]
#判断self.username是否在字典中
if Myserver.userinfo.has_key(self.username):
#用户名存在发送valid给客户端
self.request.sendall('valid')
else:
self.request.sendall('invalid')
#如果数据是以userpasswd开头
elif recvdata.startswith('userpasswd'):
#以:为分隔符,取出最后一段赋值给self.userpasswd
self.userpasswd = recvdata.split(':')[-1]
print self.userpasswd
#判断self.userpasswd是否正确
if Myserver.userinfo[self.username] == self.userpasswd:
self.request.sendall('valid')
time.sleep(0.5)
self.request.sendall('%s broken connect with server ' % time.strftime("5Y-%m-%d %x",time.localtime()))
break
else:
self.request.sendall('invalid')
print "broken connect with %s" % self.client_address[0]
if __name__ == '__main__':
try:
#创建一个sockerserver连接
srv = SocketServer.ThreadingTCPServer(('127.0.0.1',8123),Myserver)
#在后台一直运行
srv.serve_forever()
except KeyboardInterrupt:
print "CTRL+C,break"
sys.exit()
[root@python day5]# cat tcpclient.py
#!/usr/bin/env python
import socket
import time
ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ss.connect(('127.0.0.1',8123))
ss.sendall('Now client connect to Server') #发送数据到server端
aa = ss.recv(1024) #接收server端发过来的数据
print aa
while True:
username = raw_input('-->username: ').strip() #输入用户名
ss.sendall('username:' + username ) #将用户名以特定格式发送给server端
re = ss.recv(1024) #接收server端反馈回来的数据
if re == 'valid': #判断输入的用户名是否正确
break
else:
print "username Erroe,try again"
continue
while True:
userpasswd = raw_input('-->userpasswd: ').strip()
ss.sendall('userpasswd:' + userpasswd)
re = ss.recv(1024)
if re == 'valid':
print ss.recv(1024)
break
else:
print 'userpasswd Error,try again'
continue