2016-10-20 7 views
0

私は別のサーバにログインし、ソケットを介してウェブページ(購読機能を通じて)にデータをプッシュするWebsocket Serverを設定していました。限り、私はwebsocketが実行されているファイルからブロードキャスト関数を呼び出すと、すべてがうまくいきます。しかし、私のプッシュ機能がコマンドラインに出力されている別のpythonファイルからブロードキャストメソッドを呼び出すと、クライアントはメッセージを受け取っていません。Twisted Websocket - 別のファイルから呼び出されたときにブロードキャストが動作しない

別のファイルからブロードキャストを呼び出すと別のインスタンスが作成され、self.clientsが空であると仮定します。 合計すると、接続されたクライアントはloginGESI()からのブロードキャストを取得しますが、scrptCallbackHandlerExample(subType)からの2番目のファイルにはブロードキャストしません。

助けてもらえますか?ここ

が私のWebSocketファイルです:

class BroadcastServerProtocol(WebSocketServerProtocol): 

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

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

class BroadcastServerFactory(WebSocketServerFactory): 
    clients = [] 

    def __init__(self, url): 
     WebSocketServerFactory.__init__(self, url) 

    def register(self, client): 
     if client not in self.clients: 
      print("registered client {}".format(client.peer)) 
      self.clients.append(client) 

    def unregister(self, client): 
     if client in self.clients: 
      print("unregistered client {}".format(client.peer)) 
      self.clients.remove(client) 

    @classmethod 
    def broadcast(self, msg): 
     print("broadcasting message '{}' ..".format(msg)) 
     print(self.clients) 
     for c in self.clients: 
      c.sendMessage(msg.encode('utf8')) 
      print("message sent to {}".format(c.peer)) 

def login(): 
    codesys = Test_Client("FTS_test") 
    result = codesys.login() 
    # FTS = codesys.searchForPackage("F000012") 
    FTS = ["15900"]; 
    scrptContextId = [None] * len(FTS) 
    itemContextIds_array = [None] * len(FTS) 
    for i in range(0,len(FTS)): 
     result, scrptContextId[i] = codesys.createSubscription(c_ScrptCallbackHandlerExample, 100, int(FTS[i])) 
     print("SubscriptionRoomId: "+str(scrptContextId[i])) 
     result, itemContextIds_array[i], diagInfo = codesys.attachToSubscription(1, [FTS[i]+'.speed'], [100]) 
     print("Subscription done for: "+str(itemContextIds_array[i])) 
     print("Subscription for: Speed") 

    BroadcastServerFactory.broadcast(str(FTS[0])) 


if __name__ == '__main__': 

    # Logger Websocket 
    log.startLogging(sys.stdout) 
    # factory initialisieren 
    ServerFactory = BroadcastServerFactory 
    factory = ServerFactory("ws://127.0.0.1:9000") 
    factory.protocol = BroadcastServerProtocol 
    listenWS(factory) 
    # reactor initialisieren 
    webdir = File(".") 
    web = Site(webdir) 
    reactor.listenTCP(8080, web) 

    reactor.callLater(5, login) 

    reactor.run() 

とここに私のサブスクリプションファイル:

# Launch of the CallbackHandler named in the createSubscription function 
# CallbackHandler describes what happens to a variable which changes its value 
def scrptCallbackHandlerExample(subType): 
    BroadcastServerFactory.broadcast('test') 

    # Saves the value of the variables(s) in an array 
    dataValue = [] 
    for i in range(0,subType.size): 
     dataValue.append(subType.dataItems[i].node.dataValue) 

    # Print variabel informations on the screen 
    print "*****Callback - Data Change in a Variable*****" 
    print('Subscription ID: %d' % subType.subscrId) 
    for idx in range(0,subType.size): 
     print('** Item %d **' % idx) 
     print('Item Id: %d' % subType.dataItems[idx].dataItemId) 
     print('Item Node ID: %s' % subType.dataItems[idx].node.nodeId) 
     print('Item data value: %s' % subType.dataItems[idx].node.dataValue) 
     print('Item data type: %s' % subType.dataItems[idx].node.dataType) 
     print('******************************') 
# Define the type of the function as an eSubscriptionType 
CB_FUNC_TYPE = CFUNCTYPE(None, eSubscriptionType) 
c_ScrptCallbackHandlerExample = CB_FUNC_TYPE(scrptCallbackHandlerExample) 

よろしく

+0

このようには機能しません。他のスクリプトは他のプロセスとして実行され、他のプロセスへのアクセスはありません。これを行うには、IPCの種類が必要です。 https://docs.python.org/2/library/ipc.html –

+0

私はその間も読んでいました。グローバル変数で通信できませんでしたか?私はそれを試みましたが、それでもまだ動作しません....別のアイデアは、私のソケットファイルに他のpythonファイルを含めることでしたが、私はEOFErrorを取得10054:リモートホストによって強制的に既存の接続が閉じられました。結局のところ私はプログラミングやPythonにはまったく新しいことを認めなければならないが、IPCはおそらく私のためにはあまりにも多すぎるだろうが、はるかに簡単な解決法はないのだろうか? – Caligula

+0

共有コードを持つ2つの別々のプロセスは、同じモデルのヘッドライトを持つ2台の車のようなものです。一方のライトをオンにすると、もう一方の車では何も起こりません。 –

答えて

0

私は、私のoppinionで、かなりきちんとした回避策を見つけました。

私の購読機能が呼び出されるたびに、私はローカルクライアントと私のwebsocketサーバーに接続し、彼に新しい値のメッセージを送り、websocketサーバーはこれを他のクライアントにプッシュします。私はまだそれに取り組んでいるので、私はコードを投稿することはできませんが、機能は与えられています。だから誰かが解決策に興味があるなら私に知らせて、私は私のことを投稿することができます。

関連する問題