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