gpt4 book ai didi

python - 扭曲的task.loop和pb auth

转载 作者:行者123 更新时间:2023-12-01 06:08:51 27 4
gpt4 key购买 nike

学习扭曲。我决定编写一个服务器和客户端,每秒一次共享数据。写了一个实现,但在我看来,它是不正确的。

# -*- coding: utf-8 -*-

from twisted.spread import pb
from twisted.internet import reactor, task
from twisted.cred import credentials
from win32com.server import factory

class login_send:

def __init__(self):
self.count=0
self.timeout = 1.0
self.factory = pb.PBClientFactory()
reactor.connectTCP("localhost", 8800, self.factory)

def testTimeout(self):
self.count+=1
print self.count

def1 = self.factory.login(credentials.UsernamePassword("test1","bb1b"))
def1.addCallbacks(self.good_connected, self.bad_connected)
def1.addCallback(self.send_data)
def1.addErrback(self.disconnect)
if self.count>10:def1.addBoth(self.disconnect)

def start(self):
l = task.LoopingCall(self.testTimeout)
l.start(self.timeout)
reactor.run()

def good_connected(self, perspective):
print 'good login and password', perspective
return perspective

def bad_connected(self, perspective):
print 'bad login or password', perspective
return perspective

def send_data(self, perspective):
print 'send'
return perspective.callRemote("foo", self.count)

def disconnect(self, perspective):
print 'disconnect'
reactor.stop()

if __name__ == "__main__":
st=login_send()
st.start()

代码:如果登录名和密码为 True -> 发送 self.count,如果登录名和密码为 False -> 断开连接,如果 self.count>10 -> 断开连接

我认为第一个错误是我每次都必须登录。

def1 = self.factory.login(credentials.UsernamePassword("test1", "bb1b"))

如何进行一次授权,并持续每秒发送数据?

简单的测试服务器代码:

from zope.interface import implements

from twisted.spread import pb
from twisted.cred import checkers, portal
from twisted.internet import reactor

class MyPerspective(pb.Avatar):
def __init__(self, name):
self.name = name
def perspective_foo(self, arg):
print "I am", self.name, "perspective_foo(",arg,") called on", self
return arg

class MyRealm:
implements(portal.IRealm)
def requestAvatar(self, avatarId, mind, *interfaces):
if pb.IPerspective not in interfaces:
print 'qqqq'
raise NotImplementedError
return pb.IPerspective, MyPerspective(avatarId), lambda:None

p = portal.Portal(MyRealm())
c = checkers.InMemoryUsernamePasswordDatabaseDontUse(test1="bbb",
user2="pass2")
p.registerChecker(c)
reactor.listenTCP(8800, pb.PBServerFactory(p))
reactor.run()

最佳答案

我相信这应该能解决问题。

# Upper case first letter of class name is good policy.
class Login_send:

def __init__(self):
# initialize the state variable to False.
self.connection = False
self.count=0
self.timeout = 1.0
self.factory = pb.PBClientFactory()
reactor.connectTCP("localhost", 8800, self.factory)

def testTimeout(self):
self.count+=1
print self.count

# no connection -- create one.
if not self.connection:
self.assign_connection()

# cached connection exists, call send_data manually.
elif self.count > 10:
self.disconnect(self.connection)
else:
#you probably want to send data only if it it should be valid.
self.send_data(self.connection)

def assign_connection(self):
''' Creates and stores a Deffered which represents the connection to
the server. '''
# cache the connection.
self.connection = self.factory.login(
credentials.UsernamePassword("test1","bb1b"))
# add connection callbacks as normal.
self.connection.addCallbacks(
self.good_connected, self.bad_connected)
self.connection.addCallback(self.send_data)
self.connection.addErrback(self.disconnect)

def disconnect(self, perspective):
# be sure to cleanup after yourself!
self.connection = False
print 'disconnect'
reactor.stop()

# the rest of your class goes here.

关于python - 扭曲的task.loop和pb auth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6838728/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com