2014-07-16 174 views
0

在JavaScript中註冊的調用過程剛開始使用高速公路。我已經做了一些例子,現在我試圖根據教程製作自己的服務器和客戶端。從python服務器Autobahn,Wamp

我將在服務器和客戶端的JavaScript庫中使用python的autobahn。目前,我正在努力解決只能從客戶端調用服務器到服務器的過程的問題,但反之亦然,我只能從客戶端發佈事件。

如果我嘗試調用過程我得到以下錯誤

Failure: autobahn.wamp.exception.ApplicationError: 
ApplicationError('wamp.error.no_such_procedure', args = ("no procedure 
'com.myapp.add2client' registered",), kwargs = {}) 

如此看來應用程序未註冊,但在客戶端上它看起來像它,因爲我得到一個precedure ID。

Procedure registered: 4026531820798724 

任何人都可以指向正確的方向嗎?

客戶端

<script> 

    var connection = new autobahn.Connection({ 
    url: 'ws://raspberrypi.local:8080', 
    realm: 'realm1' 
    }); 

    connection.onopen = function (session) { 

     // 1) subscribe to a topic 
     function onevent(args) { 
      console.log("Event:", args[0]); 
     } 
     session.subscribe('com.myapp.hellofromserver', onevent); 

     // 2) publish an event 
     session.publish('com.myapp.hellofromclient', ['Hello, world!']); 

     // 3) register a procedure for remoting 
     function add2(args) { 
      console.log("procedure called, result:", res); 
      return args[0] + args[1]; 
     } 
     session.register('com.myapp.add2client', add2).then(
      function (registration) { 
       console.log("Procedure registered:", registration.id); 
      }, 
      function (error) { 
       console.log("Registration failed:", error); 
      } 
     ); 

     // 4) call a remote procedure 
     session.call('com.myapp.add2server', [10, 10]).then(
      function (res) { 
      console.log("Result:", res); 
      } 
     ); 
    }; 

    connection.open(); 

    </script> 

服務器端

# Imports 

    import sys 


    from twisted.python import log 
    from twisted.internet import reactor 
    from twisted.internet.defer import inlineCallbacks 
    from twisted.internet.endpoints import serverFromString 

    from autobahn.wamp import router, types 
    from autobahn.twisted.util import sleep 
    from autobahn.twisted import wamp, websocket 

    class MyBackendComponent(wamp.ApplicationSession): 

    def onConnect(self): 
     self.join("realm1") 


    @inlineCallbacks 
    def onJoin(self, details): 


     # 1) subscribe to a topic 
     def onevent(msg): 
     print("Got event: {}".format(msg)) 

     yield self.subscribe(onevent, 'com.myapp.hellofromclient') 

     # 2) publish an event 
     self.publish('com.myapp.hellofromserver', 'Hello, world!') 

     # 3) register a procedure for remoting 
     def add2(x, y): 
     return x + y 

     self.register(add2, 'com.myapp.add2server'); 

     # 4) call a remote procedure 
     res = yield self.call('com.myapp.add2client', 2, 3) 
     print("Got result: {}".format(res)) 




    if __name__ == '__main__': 

    ## 0) start logging to console 
    log.startLogging(sys.stdout) 

    ## 1) create a WAMP router factory 
    router_factory = router.RouterFactory() 

    ## 2) create a WAMP router session factory 
    session_factory = wamp.RouterSessionFactory(router_factory) 

    ## 3) Optionally, add embedded WAMP application sessions to the router 
    component_config = types.ComponentConfig(realm = "realm1") 
    component_session = MyBackendComponent(component_config) 
    session_factory.add(component_session) 

    ## 4) create a WAMP-over-WebSocket transport server factory 
    transport_factory = websocket.WampWebSocketServerFactory(session_factory, \ 
                  debug = True, \ 
                  debug_wamp = False) 

    ## 5) start the server from a Twisted endpoint 
    server = serverFromString(reactor, "tcp:8080") 
    server.listen(transport_factory) 

    ## 6) now enter the Twisted reactor loop 
    reactor.run() 

異常

Unhandled error in Deferred: 
Unhandled Error 
Traceback (most recent call last): 
Failure: autobahn.wamp.exception.ApplicationError: ApplicationError('wamp.error.no_such_procedure', args = ("no procedure 'com.myapp.add2client' registered",), kwargs = {}) 
Got event: Hello, my dear server! 

非常感謝!

回答

0

當後端組件連接到路由器並嘗試呼叫com.myapp.add2client時,客戶端(瀏覽器)尚未連接,因此該過程尚未註冊。

如果您針對獨立運行的WAMP路由器運行前端和後端組件,則可以控制組件啓動的順序。如果您沿着嵌入式路由器運行後端組件(與您一樣),則後端組件將比任何可能連接的前端組件早啓動。

+0

好吧,我想我明白了。非常感謝! – user1532132