DDE就是dynamic data exchange的简称,
好像是windows的独有一个技术(和.NET有关?)
听得似乎不多,但是如果你尝试用Excel,
看到有的时候会发现Excel怎么有些栏位是会动的
然后你可能会发现app|topic!item
这样的东西在那个栏位的公式里
这个就是DDE啦
基本上这个DDE感觉就是一个推送-订阅的概念。
首先你需要订阅,在Excel中,在公示栏输入app|topic!item
的意思就是你要订阅名字为app
的应用的主题topic
下
的item
(当然用其他语言也能订阅)
接着发送的部分(实际上发送的部分应该先于订阅,因为没有资料源你跟谁订阅),就是一个server,定期的通过API推送(这个过程貌似叫advise在DDE中)
概念很简单,然而网上资料实在是忒少了,我用谷歌试了好多关键字也没有介绍怎么架设一个DDE的server(大多数叫你用Excel去订阅人家应用的资料),那我好不容易出了坑,各位就尽量少进坑吧
我们需要用到的库是node-dde,看着那可怜的star数以及遥远的更新日期就知道这个protocol真的..
安装很简单就是
npm install node-dde
基本上来说会报错(说你的edge需要自己build,如果你对node常更新的话),不用管它
我们再安装edge,我们使用edge-js,这是原版的的一个fork,帮你pre-build过了,基本上8.x,9.x都木有问题。当然你也可以使用原版的edge,不过需要蛋疼的安装。
那因为我们用的edge-js
,所以我们需要稍微改下node-dde
。基本上没区别,唯一的区别是要把node_modules/node-dde/clients.js
的第一行
var edge = require('edge');
改成
var edge = require('edge-js');
就好啦
使用的方法很简单,你需要先给你的资料源起个名称?
var dde = require('node-dde');
server = dde.createServer('app');
对了,在node-dde上罗列了很多的Event,然而那些on
的callback
基本上就是给你console
用的,返回的值没有任何用处(我就是在这里被卡了好久)
真正有用的是override
这些函数
server.onBeforeConnect = function(topic) { return true; };
server.onAfterConnect = function(service, topic) {};
server.onDisconnect = function(service, topic) {};
server.onStartAdvise = function(service, topic, item, format) { return true; };
server.onStopAdvise = function(service, topic, item) {};
server.onExecute = function(service, topic, command) {};
server.onPoke = function(service, topic, item, data, format) {};
server.onRequest = function(service, topic, item, format) { return ''; };
server.onAdvise = function(topic, item, format) { return ''; };
基本上有用的是
server.onStartAdvise;
这函数负责处理有人送订阅请求的时候要怎么处理。
主要就是这边的format
当为1
的时候你就可以直接push
文字资料,如果是别的format
请你搜索(搜到算我输…)
所以我们就把format
限制为1
(故事貌似是这样的,像Excel之类会尝试多个format
直到你说true
,如果你用了默认的函数(不管如何都是true
,那Excel会期待你送格式50016
的数据给他(Excel的第一次尝试)…))
server.onStartAdvise = function (service, topic, item, format) {
return format === 1;
};
然后是
server.onAdvise;
这个函数就是发数据啦,这个就看你发挥了,我借用例子就是
var i = 0;
server.onAdvise = function (topic, item, format) {
console.log("in onAdvise function");
console.log(topic, item, format);
return 'hello' + i++;
};
最后,你需要push
这个动作,就是
server.advise('topic', 'item');
这个就是说我要广播topic
的'
,那具体广播的内容,
server.onAdvise;
里定义咯(理论上你应该在这个函数里根据参数topic
,item
, format
去决定你要发送什么)
如前面所说,DDE就是一个单纯的协议
有了server,其实client是什么并无规定
如果上面的例子,我们在excel中输入
=app|topic!item
你应该就可以看到变化啦
node-dde支持client。
基本上一样
dde.createClient('app', 'topic');
告诉订阅什么应用的什么主题
以及
client.startAdvise('item');
告知订阅的项目
其他的参考github的例子即可,然而给的例子实际有点坑,
因为我这边反正会自己退出,我猜是event loop的坑所以我最后加了个setInterval
卡在底下。
var dde = require('node-dde');
client = dde.createClient('app', 'topic');
client.on('disconnected', function (service, topic, isDisposed, isServerInitiated) {
console.log('Odisconnected: '
+ 'Service: ' + service
+ ', Topic: ' + topic
+ ', IsDisposed: ' + isDisposed
+ ', IsServerInitiated: ' + isServerInitiated);
});
client.on('advise', function (service, topic, item, text) {
console.log('OnAdvise: '
+ 'Service: ' + service
+ ', Topic: ' + topic
+ ', Item: ' + item
+ ', Text: ' + text);
});
client.connect();
client.startAdvise('item');
setInterval(function () {
console.log('500')
}, 500);