这个例子网上讲SocketServer大部分都用的这个,他讲的是服务器端有3个用户,都有密码,当客户端连请求连接的时候验证用户名和密码,然后退出,自己也写了一下,为以后好回顾,也贴一下代码和解释,完整代码见附件《代码》:
server.py #Server端
#!/usr/bin/env python import SocketServer,time import sys class Myserver(SocketServer.BaseRequestHandler): userinfo={'fan':'123','te':'234','fei':'345'} def handle(self): print 'Now connect form ',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') elif recvdata.startswith('username'): self.username=recvdata.split(':')[-1] if Myserver.userinfo.has_key(self.username): self.request.sendall('valid') else: self.request.sendall('invalid') elif recvdata.startswith('userpasswd'): self.userpasswd=recvdata.split(':')[-1] print 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("%Y-%m-%d %X", time.localtime())) break else: self.request.sendall('invalid') print "broken connect with %s"%self.client_address[0] if __name__=='__main__': try: srv=SocketServer.ThreadingTCPServer(('127.0.0.1',8123), Myserver) srv.serve_forever() except KeyboardInterrupt: print "CTRL+C,break" sys.exit()
第5行:定义了一个用户字典userinfo,key是用户名,value是密码
第7行:接收并打印去来自什么IP的访问,SocketServer中self.client_address接收的是客户IP和端口号的元组,所以self.client_address[0]是客户IP
第9行:开始循环接收数据,数据赋值给recvdata
第14行:如果recvdata是以username开头的字符串,则客户端发送过来的就是用户名验证(客户返送用户的是【username:用户名】的形式发过来的,【字符串.startswith(XX)】是否字符串是以XX开头,如果是为True,如果不是False)
第15行:由上可知,recvdata以分割后最后一个值为用户名并赋值给self.username
第16行:判断字典userinfo是否有这个键,注意userinfo的访问方式
第17-19行:如果有客户发过来的用户名,则向客户端发送valid,注:SocketServer中发送用self.request.send或者self.request.sendall
第20-31行:和用户名验证一样
第34行:捕获异常
第35-37行:启动SocketServer
第38以上行:捕获KeyboardInterrupt
client.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') aa=ss.recv(1024) print aa while True: username=raw_input('-->username:').strip() ss.sendall('username:'+username) re=ss.recv(1024) if re=='valid': break else: print "username Error,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