如何用Twisted连接两个程序

2024-09-28 01:29:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Twisted的echoserver,需要从echoclient获取输入。回声是一个图形用户界面(Panda3D)。客户端只在单击按钮时发送一条短消息。在

所以我有一些不定期发送的消息(只有当点击按钮时)。在

我怎样才能有一个永久性的连接反应器.运行()已在客户端程序的开始处启动)并发送消息。在

我不想在EchoClient/connectionMade中编写轮询机制。我看到了一个gtk+的例子,但是不能翻译成Panda。怎么走。下面的代码根本不起作用,但让你知道我想要什么(基本上是永久连接,偶尔用户按下按钮时会发送一些信息)。在

from direct.showbase.ShowBase import ShowBase
from direct.gui.DirectButton import DirectButton
from panda3d.core import Vec3
from direct.task import Task

from twisted.internet import protocol, reactor, defer
from twisted.internet.task import LoopingCall
from twisted.spread import pb

FRAMERATE = 32

class LoginDialog:
   def __init__(self, deferred):
     self.deferredResult = deferred

class EchoClient(ShowBase, protocol.Protocol):
   def __init__(self):
      ShowBase.__init__(self)

      self.echoer = echoer   
      self.button = DirectButton(pos = Vec3(.1,0,.1), text = "Send request",
               scale = .1, pad = (.5, .5),
               rolloverSound = None, clickSound = None,
               command = self.Request)

   def Request():
      self.echoer.transport.write("Message from client")

   def dataReceived(self, data):
       print "Server said: ", data

cf = pb.PBClientFactory()
cf.getRootObject().addCallback(EchoClient)
reactor.connectTCP("localhost", 17000, cf)
LoopingCall(taskMgr.step).start(1 / FRAMERATE)
reactor.run()

Tags: fromimportself消息initdeftwisted按钮
3条回答

看看多重处理:http://docs.python.org/2/library/multiprocessing.html

您可以启动和连接不同的进程,以及它们之间的消息。在

我找到了答案。现在我有一个程序,只要按下按钮,就会向服务器发送消息。我用ClientCreator创建了一个EchoClient。像这样:

      self.clientcreate = protocol.ClientCreator(reactor, EchoClient)
      self.clientcreate.connectTCP(host, port).addCallbacks(self.connectionMade,
               self.connectionFailed)

现在当我连接TCP,并建立连接时,它会调用自我连接方式一旦成功。 因此,它也为函数提供了EchoClient。所以我可以储存它(自助式客户机=echoclient),并在需要时使用(无法通过工厂实现)。在

例如,按钮调用函数请求,在那里我可以直接使用传输.写入命令,因为我现在有客户了。所以self.client.传输.write('whatever')。在

如果以前的人不明白我想要什么,有更好的想法来完成这件事,我想看看他们的评论(我想学习)。在

完整代码(仅限客户端):

^{pr2}$

如果您将客户机和服务器作为同一进程的一部分,那么您将始终(实际上总是)能够将信息从一个传递到另一个。在

如果您使客户机和服务器的进程不同,那么可能没有满足您需求的解决方案。在

你总是要做一些事情来建立两个过程之间的联系,而且这种联系总是有可能消失的。对不起的。在

相关问题 更多 >

    热门问题