您的位置:首页 > 其它

websocket rpc远程调用分析

2017-08-25 15:49 260 查看
首先在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上绘制图像
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: