python socketserver库_python之SocketServer服务器端和客户端

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值