1

添付のコードに従って、クラス processのクラスBroadcastServerFactoryからブロードキャスト関数を呼び出すのを手伝ってくれませんか。

別のクラスから関数を呼び出す非常に多くの方法を試しましたが、解決策はありません

import time, sys
from apscheduler.scheduler import Scheduler
import threading
import socket
from twisted.internet import reactor
from twisted.python import log
from twisted.web.server import Site
from twisted.web.static import File

from autobahn.websocket import WebSocketServerFactory, \
                               WebSocketServerProtocol, \
                               listenWS


class process(threading.Thread):
    def __init__(self, buffer3):
        threading.Thread.__init__(self)
        self.setDaemon(True)
        self.buffer3 = buffer3


    def run(self):
        factory.broadcast("I don't know what I'm doing!")



class BroadcastServerProtocol(WebSocketServerProtocol):

   def onOpen(self):
      self.factory.register(self)

   def onMessage(self, msg, binary):
      if not binary:
         self.factory.broadcast("'%s' from %s" % (msg, self.peerstr))

   def connectionLost(self, reason):
      WebSocketServerProtocol.connectionLost(self, reason)
      self.factory.unregister(self)


class BroadcastServerFactory(WebSocketServerFactory):
   """
   Simple broadcast server broadcasting any message it receives to all
   currently connected clients.
   """

   def __init__(self, url, debug = False, debugCodePaths = False):
      WebSocketServerFactory.__init__(self, url, debug = debug, debugCodePaths = debugCodePaths)
      self.clients = []
      self.tickcount = 0
      self.tick()

   def tick(self):
      self.tickcount += 1
      self.broadcast("'tick %d' from server" % self.tickcount)
      reactor.callLater(1, self.tick)

   def register(self, client):
      if not client in self.clients:
         print "registered client " + client.peerstr
         self.clients.append(client)

   def unregister(self, client):
      if client in self.clients:
         print "unregistered client " + client.peerstr
         self.clients.remove(client)

   def broadcast(self, msg):
      print "broadcasting message '%s' .." % msg
      for c in self.clients:
         c.sendMessage(msg)
         print "message sent to " + c.peerstr


class BroadcastPreparedServerFactory(BroadcastServerFactory):
   """
   Functionally same as above, but optimized broadcast using
   prepareMessage and sendPreparedMessage.
   """

   def broadcast(self, msg):
      print "broadcasting prepared message '%s' .." % msg
      preparedMsg = self.prepareMessage(msg)
      for c in self.clients:
         c.sendPreparedMessage(preparedMsg)
         print "prepared message sent to " + c.peerstr


def testing():
    buffer2 - "hello"
    myDisplay = process(buffer2)
    myDisplay.start()


if __name__ == '__main__':

   if len(sys.argv) > 1 and sys.argv[1] == 'debug':
      log.startLogging(sys.stdout)
      debug = True
   else:
      debug = False
   level_scheduler = Scheduler()
   level_scheduler.add_interval_job(testing, seconds=5)
   level_scheduler.start()
   #ServerFactory = BroadcastServerFactory
   ServerFactory = BroadcastPreparedServerFactory

   factory = ServerFactory("ws://localhost:9000",
                           debug = debug,
                           debugCodePaths = debug)

   factory.protocol = BroadcastServerProtocol
   factory.setProtocolOptions(allowHixie76 = True)
   listenWS(factory)

   webdir = File(".")
   web = Site(webdir)
   reactor.listenTCP(8080, web)


   reactor.run()

ありがとう

4

1 に答える 1

1

作成時BroadcastServerFactoryに呼び出されるクラス インスタンスに、呼び出されるクラス インスタンスを渡します。process

class process(threading.Thread):
    def __init__(self, buffer3m, broadcast_server_factory):
        threading.Thread.__init__(self)
        self.setDaemon(True)
        self.buffer3 = buffer3

        self.factory = broadcast_server_factory

    def run(self):
        self.factory.broadcast("I don't know what I'm doing!")

そしてそれを呼び出します(ステートメントのようself.factoryに割り当てられます。クラスrunを作成する場所はわかりませんが、次のようなもので作成されますprocess__main__

 p = process(buffer, factory)

余談: クラス名に大文字を使用することは、Python では適切な形式と見なされますprocess -> Process

于 2013-02-15T10:11:14.797 に答える