这个例子网上讲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