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上绘制图像
里面注册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上绘制图像
相关文章推荐
- 远程调用服务(RPC)和消息队列(Message Queue)对比及其适用/不适用场合分析
- Openstack Nova 源码分析 — RPC 远程调用过程
- 远程调用服务(RPC)和消息队列(Message Queue)对比及其适用/不适用场合分析
- 简单学习rpc -- thrift 远程调用流程简单分析
- 简单学习rpc -- thrift 远程调用流程简单分析
- dubbo源码分析-RPC远程调用模块与Remoting通讯模块协作细节
- 远程调用服务(RPC)和消息队列(Message Queue)对比及其适用/不适用场合分析
- php xml-rpc远程调用
- 使用 xml-rpc 远程调用
- 远程调用服务(RPC)和消息(Message Queue)对比及其适用/不适用场合
- 远程过程调用RPC
- web service与远程调用(RPC)的区别
- RPC的发展历史(本质就是双方定义好协议,传递参数后远程调用)
- RPC远程调用概念 && demo实例
- 深入浅出Alljoyn——实例分析之远程调用(Method)篇
- go语言net包rpc远程调用的使用
- 11.3.2、基于消息通信的RPC调用 之 RabbirMQ分析
- 【远程调用框架】如何实现一个简单的RPC框架(五)优化三:软负载中心设计与实现
- 远程调用服务(RPC)和消息(Message Queue)对比及其适用/不适用场合(转)
- rpc远程调用的简单实现