websocket rpc远程调用分析

首先在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上绘制图像

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值