0

我在 Twisted 中有一个需要从 echoclient 获取输入的 echoserver。echocient 是一个 GUI (Panda3D)。单击按钮时,客户端仅发送一条短消息。

所以我有消息要在不规则的时间发送(仅在单击按钮时)。

如何建立永久连接(reactor.run() 已在客户端程序开始时启动)并发送消息。

我不想在 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()
4

3 回答 3

1

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

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

总是 需要一些事情来建立两个进程之间的连接,而且它总是有可能消失。对不起。

于 2013-11-17T20:21:48.593 回答
0

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

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

现在,当我连接 TCP 并建立连接时,它会在成功时调用 self.ConnectionMade。因此,它还将 EchoClient 提供给该功能。所以我可以存储它(self.client = echoclient),并在需要时使用它(无法通过工厂实现)。

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

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

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

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

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

FRAMERATE = 32

class ButtonDialog(ShowBase):
   def __init__(self):

      ShowBase.__init__(self)

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

      host = "localhost"
      port = 17001

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

   def connectionFailed(self, f):
       print "Connection Failed:", f
       reactor.stop()

   def connectionMade(self, echoclient):
       self.client = echoclient

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

class EchoClient(protocol.Protocol):

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

   def connectionLost(self, err):
       print "Connection is lost: " + str(err)
       reactor.stop()

ButtonDialog()
LoopingCall(taskMgr.step).start(1 / FRAMERATE)
reactor.run()
于 2013-11-23T13:25:09.460 回答
0

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

您可以启动和加入不同的进程以及它们之间的消息。

于 2013-11-21T23:14:16.433 回答