`
xhload3d
  • 浏览: 208094 次
社区版块
存档分类
最新评论

基于HTML5的3D网络拓扑自动布局

阅读更多

上篇将HT for Web的3D拓扑弹力布局的算法运行在Web Workers后台(http://www.hightopo.com/blog/70.html),这篇我们将进一步折腾,将算法运行到真正的后台:Node.js,事先申明Node.js篇和Web Workers篇一样,在这个应用场景下并不能提高性能,纯粹为了折腾好玩,当然也不会白玩,人生就在折腾中,只有折腾才能真正成长。

核心实现代码和Web Workers篇基本一致,唯一区别在于前后台交互的方式上,worker通过postMessage和addEventListener('message' 就可以发送和接收消息,对于真正分离前后台的Node.js自然没那么简单了,我采用了Socket.io通信框架,Socket.io让长连接通信变得无比简单,和Web Workers的通信几乎一样的容易了,Socket.io的用法下图一目了然:

Node.js后台代码如下,通过require引入HT和Socket.io相关类库,io = require('socket.io').listen(8036)构建出一个监听在8036端口的服务,通过io.sockets.on('connection'等着客户端页面来建立的socket通信,通过socket.on('moveMap',监听客户端发过来的图片节点拖拽变化信息进行同步,通过 socket.emit('result', result);发送自动布局算法的运算结果push到客户端。

io = require('socket.io').listen(8036);
ht = require('ht.js').ht;
require("ht-forcelayout.js");
reloadModel = require("util.js").reloadModel;    

io.sockets.on('connection', function (socket) {    
    var dataModel = new ht.DataModel(),
        forceLayout = new ht.layout.Force3dLayout(dataModel);

    forceLayout.onRelaxed = function(){    
        var result = {};
        dataModel.each(function(data){
           if(data instanceof ht.Node){
               result[data._id] = data.p3();
           } 
        });
        socket.emit('result', result);
    };
    forceLayout.start();

    socket.on('moveMap', function (moveMap) {
        dataModel.sm().cs();
        for(var id in moveMap){
            var data = dataModel.getDataById(id);
            if(data){
                data.p3(moveMap[id]);
                dataModel.sm().as(data);
            }
        }     
    });
    socket.on('reload', function (data) {
        reloadModel(dataModel, data);   
    });           
});

客户端的代码需要通过引入Socket.io客户端类库,通过socket = io.connect('http://localhost:8036/')链接服务器获得握手链接socket对象,剩下的代码就是同socket.emit发送客户端拖拽信息,以及socket.on监听服务器推送过来的自动布局结果:

            g3d.mi(function(evt){
                if(evt.kind === 'betweenMove'){                
                    moveMap = {};
                    g3d.sm().each(function(data){
                        if(data instanceof ht.Node){
                            moveMap[data._id] = data.p3();
                        }
                    });
                    socket.emit('moveMap', moveMap);                
                }
            }); 

            socket = io.connect('http://localhost:8036/');                              
            socket.on('result', function (result) {
                for(var id in result){
                    var data = dataModel.getDataById([id]);
                    if(data && !g3d.isSelected(data)){
                        data.p3(result[id]);
                    }                
                } 
            });

几个注意点:

1、首选和Web Workers一样,跑在Node.js的类库肯定不能操作window和document之类的页面特定元素对象,从这点说很多考虑不周全的类库会把自己限制死只能在页面主线程运行,这点HT for Web考虑得很周到,不仅ht.js包括所有ht-forcelayout.js插件都是可运在Web Workers和Node.js的非GUI环境,因为我也常需要ht.js运行在后台直接将DataModel的数据和前台进行JSON的数据格式转换存储。

2、Util.js定义的reloadModel函数我增加了this.reloadModel = reloadModel;的逻辑,这样才能在Node.js后台代码reloadModel = require("../util.js").reloadModel; 这样的方式得到该函数进行调用,细节可以参考 http://nodejs.org/api/modules.html 的章节

3、这个例子是有缺陷的,以下视频播放过程你会发现,我打开了两个页面,这样就会有两个socket分别连接后台Node.js,而Node.js默认是单线程的,如果正在一个请求函数密集运算处理,则其他请求只能排队等待处理,这也是视频中我拖拽一个页面布局是,另一个页面无法操作的原因。当然你可以改进demo,采用http://nodejs.org/api/cluster.html的cluster方式,实现真正的后台多核任务处理

http://v.youku.com/v_show/id_XNjc1MjY2ODE2.html

  

2
1
分享到:
评论

相关推荐

    网络拓扑自动布局算法

    4. "代谢网络自动绘制的快速网格布局算法.pdf":代谢网络是一种特殊的网络,由生物体内的化学反应构成。这篇论文可能提出了一种快速网格布局算法,特别针对这类网络的特性。网格布局通常能有效地组织大量节点,且有...

    论文研究-基于扩展力学模型的网络拓扑图布局算法.pdf

    针对现有网络拓扑图布局算法多以节点分布均匀为目标,没有考虑边的布局,可能会导致生成的拓扑图中边布局不清晰,提出一种基于扩展力学模型的网络拓扑图布局算法。该算法通过引入点边斥力保证边布局清晰,通过节点...

    python网络拓扑可视化

    基于pygame实现的网络拓扑可视化是一种创新的方法,pygame是一个Python库,主要用于开发2D游戏和图形用户界面。它提供了丰富的图形绘制、事件处理和音频播放功能,使得构建网络拓扑视图变得可能。利用pygame,我们...

    js和html5实现网络拓扑图

    使用Qunee,开发者可以方便地创建、编辑和布局网络拓扑图,同时支持交互操作,例如节点拖放、连接线增删等。 在实现网络拓扑图自动排列时,我们需要考虑以下几个关键点: 1. **节点定义**:每个网络设备或连接点在...

    基于 HTML5 快速构建拓扑图1

    基于 HTML5 快速构建拓扑图是现代 Web 应用中的一个重要技术,尤其在电信、电力、工业控制等领域,用于可视化复杂的网络结构和工作流程。HT 是一种基于 HTML5 的图形化解决方案,它简化了拓扑图的开发过程,让开发者...

    基于SNMP的网络拓扑发现开源让u软件.zip

    功能如下: ...拓扑图可以按树型、Spring、圆形、Organic等自动布局排列。 4.设备内部资源发现 自动发现出设备内部的网口、光口、电口、磁盘、内存、CPU、软件服务等资源信息,进一步了解设备的内部状态。

    基于华为eNSP的网络安全拓扑,可用于毕设参考,课设参考,附报告

    基于华为eNSP的网络安全拓扑,可用于毕设参考,课设参考 基于华为eNSP的网络安全拓扑,可用于毕设参考,课设参考 基于华为eNSP的网络安全拓扑,可用于毕设参考,课设参考 基于华为eNSP的网络安全拓扑,可用于毕设参考,...

    快速开发基于 HTML5 网络拓扑图应用之 DataBinding 数据绑定篇

    在开发基于HTML5的网络拓扑图应用时,DataBinding(数据绑定)是核心功能之一,它连接着用户界面和应用程序的数据模型,使得两者之间的数据更新可以自动化进行,极大地简化了开发过程。在这个"快速开发基于HTML5网络...

    bbd_dude 网络拓扑自动发现构建工具

    "bbd_dude"是一款专为网络管理员和工程师设计的免费网络拓扑自动发现构建工具。它能够自动扫描并绘制出企业网络的拓扑结构,极大地简化了网络管理任务,提高了问题定位和故障排除的效率。 网络拓扑是描述网络设备、...

    基于eNSP设计的网络拓扑,大型校园网络设计项目源码(高分)

    基于eNSP设计的网络拓扑,大型校园网络设计项目源码(高分)基于eNSP设计的网络拓扑,大型校园网络设计项目源码(高分)基于eNSP设计的网络拓扑,大型校园网络设计项目源码(高分)基于eNSP设计的网络拓扑,大型校园...

    基于学习的网络拓扑

    【基于学习的网络拓扑】 网络拓扑是网络设计的核心组成部分,它定义了网络设备(如路由器、交换机、服务器等)之间的连接方式和物理布局。理解网络拓扑有助于优化网络性能、提高网络的可靠性和可维护性。本文将深入...

    基于SNMP和Java的网络拓扑发现

    ### 基于SNMP和Java的网络拓扑发现 #### 概述 随着现代计算机网络的迅猛发展,网络管理的任务变得越来越复杂。确保网络管理系统能够高效运行的基础之一是网络拓扑发现。网络拓扑指的是计算机网络中各设备之间的...

    基于VUE的网络拓扑图动态线条实现

    在IT行业中,网络拓扑图是一种直观展示网络设备和连接关系的图形表示,它有助于理解和管理复杂的网络结构。本文将详细探讨如何利用Vue.js框架来实现网络拓扑图中的动态线条效果。 Vue.js是一个轻量级、高性能的前端...

    自动绘制网络拓扑

    本项目是一个基于Java的实现,能够根据提供的节点信息自动生成网络拓扑图。 首先,我们需要了解Java在图形用户界面(GUI)开发中的应用。Java提供了Swing和JavaFX两个主要的GUI库,可以用来创建复杂的图形元素和...

    基于网络化数据挖掘的拓扑布局算法研究.pdf

    在介绍基于网络化数据挖掘的拓扑布局算法研究之前,首先需要明确几个关键概念,包括数据挖掘、网络化数据挖掘、网络拓扑布局等。 数据挖掘是一个多学科交叉的领域,通常用于从大量数据中提取或“挖掘”隐藏的、未知...

    html5实现的网络拓扑图

    HTML5网络拓扑图是一种利用现代网页技术展示网络设备、服务器、线路等元素相互连接的图形化表示方式。在这个项目中,开发人员使用了HTML5的Canvas或SVG元素,结合JavaScript库来创建交互式的网络拓扑图表。下面将...

    研究网络拓扑自动发现的新方法.ppt

    然后,文档对不同的网络拓扑自动更新方法进行了比较和分析,包括基于SNMP协议设备互Ping方法、基于通用协议网络拓扑发现方法、基于路由协议的网络拓扑发现方法和基于二 / 三层网络拓扑发现方法。 在比较和分析的...

    快速开发基于 HTML5 网络拓扑图应用--入门篇(三)

    在本篇【快速开发基于 HTML5 网络拓扑图应用--入门篇(三)】中,我们将进一步深入探讨如何在HTML5环境下构建网络拓扑图应用,并着重讲解如何添加属性组件。这个过程旨在帮助初学者理解网络拓扑图的创建原理,以及...

    基于SNMP的网络拓扑发现

    **基于SNMP的网络拓扑发现** 网络拓扑发现是网络管理的重要组成部分,它涉及到对网络设备、连接和路径的自动识别与可视化。这一过程极大地增强了网络管理员在故障排除、资源监控、配置管理以及安全防护等方面的能力...

Global site tag (gtag.js) - Google Analytics