我有下面的客户端代码,它每8秒向服务器发送一些数据,下面是我的代码
class EchoClient(LineReceiver):
def connectionMade(self):
makeByteList()
self.transport.write(binascii.unhexlify("7777"))
while 1:
print "hello"
lep = random.randint(0,4)
print lep
print binascii.unhexlify(sendHexBytes(lep))
try:
self.transport.write("Hello")
self.transport.write(binascii.unhexlify(sendHexBytes(lep)))
except Exception, ex1:
print "Failed to send"
time.sleep(8)
def lineReceived(self, line):
pass
def dataReceived(self, data):
print "receive:", data
while循环中的每个语句都执行,self.transport.write除外。服务器没有接收到任何数据。当循环不执行时,self.transport.write也在外部。在这两种情况下都不会引发异常,但如果我删除while循环,则循环外的语句将正确执行。为什么会发生这种情况?请纠正我的错误?
twisted中的所有方法都是异步。像connectionMade
和lineReceived
这样的所有方法都发生在同一个线程上。Twisted reactor运行一个循环(称为事件循环),当这些事件发生时,它会调用connectionMade
和lineReceived
等方法。
connectionMade
中有一个无限循环。一旦Python进入这个循环,它就永远无法退出。Twisted在建立连接时调用connectionMade
,您的代码将永远留在那里。Twisted没有机会真正将数据写入传输或接收数据,它被困在connectionMade
中!
当您编写Twisted代码时,您必须理解的重要一点是,您可能不会在Twisted线程上阻塞。例如,假设我想在客户端连接后4秒发送一个"你好"。我可以这样写:
class EchoClient(LineReceiver):
def connectionMade(self):
time.sleep(4)
self.transport.write("Hello")
但这是错误的。如果两个客户端同时连接,会发生什么情况?第一个客户端将进入connectionMade
,我的程序将挂起4秒,直到发送"Hello"。
扭曲的方法是这样的:
class EchoClient(LineReceiver):
def connectionMade(self):
reactor.callLater(4, self.sendHello)
def sendHello(self):
self.transport.write("Hello")
现在,当Twisted进入connectionMade
时,它会调用reactor.callLater
来在未来4秒安排事件。然后它退出connectionMade
,继续做它需要做的所有其他事情。在你掌握异步编程的概念之前,你不能在Twisted中继续。我建议你仔细阅读这里的Twisted文档。
最后,一个无关的注意事项:如果你有一个LineReceiver
,你不应该实现你自己的dataReceived
,它会使lineReceived
不被调用。CCD_ 15是一个实现自己的CCD_ 16的协议,CCD_。