Twisted用户验证之客户端详解

下面我们来看下验证时客户端要做了哪些事情,我还是以Demo当中的代码来进行分析,这样更容易接受,也更直观,下面就是用户登录时验证以及客户端协议类的的主要代码

#   该类的方法供服务端调用
class ClientRefrence(pb.Referenceable):
	def remote_popupUserOnlineDlg(self):
		PoupUiManager.PopupUserOnlineDlg()
class ClientHandler:
	def __init__(self):
		UiManager.Handler = self

	def Connected(self,perspective):
		self.perspective = perspective
#		UiManager.MessageBox(u"登录成功")
		print "登录成功"
#		UiManager.LoginDlg().hide()

	def Failed(self,reason):
#		UiManager.MessageBox(reason.value)
		self.connector.disconnect()
		print reason.value

	def Login(self,name,pwd):
		factory = pb.PBClientFactory()
		self.connector = reactor.connectTCP("192.168.1.109", 8206, factory)
		d = factory.login(credentials.UsernamePassword(','.join((name,pwd)),''),client=ClientRefrence())
		d.addCallback(self.Connected)
		d.addCallback(self.NotifyOthserOnlineUsers)
		d.addErrback(self.Failed)
		return d

	def callRemote(self,serverFunName,object=None):
		self.perspective.callRemote(serverFunName)

	def NotifyOthserOnlineUsers(self,object=None):
		self.callRemote("NotifyOthserOnlineUsers")


其中,ClientHandler里面的 Login 方法就是用户登录方法,里面实现了twisted验证时客户端需要做的事情,那么我们就来对代码进行一行一行的分析:

----------------------------------------------------------------------

factory = pb.PBClientFactory()
self.connector = reactor.connectTCP("192.168.1.109", 8206, factory)

上面两行主要是连接服务端,一旦与服务器连接上,会返回个可管理的连接对象,客户端可以保存这个连接对象,在必要的时候可以关闭或者处理该连接,这里保存在了

self.connector这个成员变量当中

----------------------------------------------------------------------

d = factory.login(credentials.UsernamePassword(','.join((name,pwd)),''),client=ClientRefrence())

上面一行主要是通过pb.PbClientFactory对象的Login方法向服务端发送验证请求,该方法中包含了两个参数,第一个参数指明了以何种凡是进行验证,这里通过实例化credentials.UsernamePassword对象指明了以用户名/密码对的验证方式进行验证,同事在实例化credentials.UsernamePassword的过程当中将用户名和密码以实参的形式

传到服务端,这里我进行了下小的调整,为了满足我个人Demo的需要,我将用户名和密码以逗号隔开凭借成字符串的形式全部放到用户名当中传至服务端;第二个参数指明了

可以供服务端调用的客户端协议,代码中是ClientRefrence的实例化,该协议(ClientRefrence)必须继承自pb.Refrenceable(远程方法名以remote_开头)或者是pb.Avator(远程方法名以perspective_开头)协议,继承了该协议的类中的内部方法就可以供服务端调用(在服务端实现Portal.IRealm接口类重写requestAvatorId方法中一形参的形式接受了该客户端协议,可以将该客户端协议保存至客户端,以便于需要的时候直接通过调用其callRemote方法调用客户端方法)。同时Login方法返回了一个defer异步对象,该一部对象提供了三个比较常用的方法addCallback()、addErrback()及addBoth(),addCallback()在调用成功的时候进行方法回调,addErrback()在调用失败的时候进行方法回调,addBoth()不管是调用成功与否都进行方法回调

----------------------------------------------------------------------

d.addCallback(self.Connected)
d.addCallback(self.NotifyOthserOnlineUsers)
d.addErrback(self.Failed)

上面三行利用Login()方法返回的异步对象设置了不同情况的回调方法。当调用成功时回调Connected方法,Connected方法接受了一个perspective参数,该参数就是由服务端返回的一个协议,该协议在服务端继承了pb.Refrenceable或pb.Avator协议,客户端可以通过该协议调用服务端方法,当调用失败时,回调Failed方法,记录错误信息



发布了19 篇原创文章 · 获赞 5 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章