websocket rpc远程调用分析

来源:互联网 发布:hash 统计海量数据 编辑:程序博客网 时间:2024/05/20 13:16
首先在start_webserver处启动一个wsbFactory = WebSocketServerFactory
里面注册vtk_wamp.ImagePushBinaryWebSocketServerProtocol//注意这里他是服务端
里面包含了客户端与服务端交互的所有方法

    def onOpen(self)://连接打开

    def onMessage(self, msg, isBinary)://消息到来

    def onClose(self, wasClean, code, reason)://连接关闭

    def connectionLost(self, reason)://连接丢失

    def renderStaleImage(self)://渲染图像

    def render(self)://渲染图像并发送


网页端
客户端会给canvas对象绑定事件,当有事件触发时
会通过rpc调用viewport.mouse.interaction方法
                session.call("viewport.mouse.interaction", [vtkWeb_event]).then(function (res) {
                    if (res) {
                        action_pending = false;
                        render();//需要喧嚷
                    }
                }, function(error) {
                    console.log("Call to viewport.mouse.interaction failed");
                    console.log(error);
                });

class vtkWebMouseHandler(vtkWebProtocol):

    @exportRpc("viewport.mouse.interaction")
        retVal = self.getApplication().HandleInteractionEvent(view, pvevent)
        del pvevent

        if retVal:
            self.getApplication().InvokeEvent('PushRender')

        return retVal
会调用到vtkWebApplication的HandleInteractionEvent方法进行事件消化
得到是否需要渲染图像,如果需要,会触发PushRender事件,这个事件是在连接成功时注册的lambda表达式
self.subscription = self.app.AddObserver('PushRender', lambda obj, event: reactor.callLater(0.0, lambda: self.render()))
进而调用他自己的render方法向客户端发送图像,
客户端收到图像自行渲染
在客户端的render函数里调用rpc 方法 viewport.image.render获取图像,进而显示到canvas上
// Setup internal API
        function render(fetch) {
            if (force_render === false) {
                if (render_onidle_timeout !== null) {
                    // clear any renderOnIdle requests that are pending since we
                    // are sending a render request.
                    GLOBAL.clearTimeout(render_onidle_timeout);
                    render_onidle_timeout = null;
                }
                force_render = true;

                var renderCfg = {
                    size: [ container.innerWidth(), container.innerHeight() ],
                    view: Number(options.view),
                    mtime: fetch ? 0 : lastMTime,
                    quality: quality,
                    localTime : new Date().getTime()
                };

                container.trigger({
                    type: 'stats',
                    stat_id: 'image-fps',
                    stat_value: 0 // start
                });

                session.call("viewport.image.render", [renderCfg]).then(function (res) {//在canvas上绘制图像

原创粉丝点击