2014-07-16 118 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