java实现dde服务端,快速开启dde服务端

DDE是WINDOWS平台上的一个完整的通信协议,它使支持动态数据交换的两个或多个应用程序能彼此交换数据和发送指令,

任何一个DDE Client都可以访问DDE Server的数据,数据交换是通过三个标识名来实现的:

应用程序名(Application):KSddeserver

主题(Topic):KStopic

项目(Item):变量名称

dde server代码如下:

/*
 * Copyright 2013 www.pretty-tools.com. All rights reserved.
 */

import com.pretty_tools.dde.ClipboardFormat;
import com.pretty_tools.dde.DDEException;
import com.pretty_tools.dde.DDEMLException;
import com.pretty_tools.dde.client.DDEClientConversation;
import com.pretty_tools.dde.client.DDEClientEventListener;
import com.pretty_tools.dde.server.DDEServer;

import java.util.Arrays;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * DDE Server Example.
 *
 * @author Alexander Kozlov
 */
public class DDEServerExample
{
    private static final String SERVICE = "MyServer";
    private static final String TOPIC = "MyTopic";
    private static final String MY_ADVISE_ITEM = "MyAdvise";
    private static final String MY_REQUEST_ITEM = "MyRequest";
    private static final String MY_POKE_ITEM = "MyPoke";
    private static final List<String> ITEMS = Arrays.asList(MY_ADVISE_ITEM, MY_REQUEST_ITEM, MY_POKE_ITEM);

    public static void main(String[] args)
    {
        try
        {
            // event to wait disconnection
            final CountDownLatch eventStop = new CountDownLatch(1);
            final AtomicInteger num = new AtomicInteger(1);

            final DDEServer server = new DDEServer(SERVICE) {
                @Override
                protected boolean isTopicSupported(String topicName)
                {
                    return TOPIC.equalsIgnoreCase(topicName);
                }

                @Override
                protected boolean isItemSupported(String topic, String item, int uFmt)
                {
                    return isTopicSupported(topic)
                           && ITEMS.contains(item)
                           && (uFmt == ClipboardFormat.CF_TEXT.getNativeCode() || uFmt == ClipboardFormat.CF_UNICODETEXT.getNativeCode());
                }

                @Override
                protected boolean onExecute(String command)
                {
                    System.out.println("onExecute(" + command + ")");

                    if ("stop".equalsIgnoreCase(command))
                        eventStop.countDown();

                    return true;
                }

                @Override
                protected boolean onPoke(String topic, String item, String data)
                {
                    System.out.println("onPoke(" + topic + ", " + item + ", " + data + ")");

                    return true;
                }

                @Override
                protected boolean onPoke(String topic, String item, byte[] data, int uFmt)
                {
                    System.out.println("onPoke(" + topic + ", " + item + ", " + data + ", " + uFmt + ")");

                    return false; // we do not support it
                }

                @Override
                protected String onRequest(String topic, String item)
                {
                    System.out.println("onRequest(" + topic + ", " + item + ")");

                    return item + " data " + num;
                }

                @Override
                protected byte[] onRequest(String topic, String item, int uFmt)
                {
                    System.out.println("onPoke(" + topic + ", " + item + ", " + uFmt + ")");

                    return null; // we do not support it
                }
            };

            System.out.println("Starting...");
            server.start();

            final Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run()
                {
                    num.incrementAndGet();
                    try {
                        System.out.println("notify clients");
                        server.notifyClients(TOPIC, MY_ADVISE_ITEM);
                    } catch (DDEException e) {
                        System.out.println("DDEClientException: " + e.getMessage());
                        cancel();
                    }
                }
            }, 1000L, 500L);

            System.out.println("Waiting for stop...");
            eventStop.await();
            System.out.println("stopping...");
            timer.cancel();
            server.stop();
            System.out.println("Exit from thread");
        }
        catch (DDEMLException e)
        {
            System.out.println("DDEMLException: 0x" + Integer.toHexString(e.getErrorCode()) + " " + e.getMessage());
        }
        catch (DDEException e)
        {
            System.out.println("DDEClientException: " + e.getMessage());
        }
        catch (Exception e)
        {
            System.out.println("Exception: " + e);
        }
    }
}

如果嫌费事的,可以直接下载编译好的jar包,Download all examples and binaries,直接运行下面命令,可以启动dde server.

java -cp .;pretty-tools-JDDE-2.1.0.jar DDEServerExample

windows下可以直接通过excel的公式来订阅dde server的变量,下面以EXCEL应用程序访问数据交换的过程,新建一个EXCEL文件,在相应的单元格中(如第一行、第一列)输入如下代码:

=KSDdeserver|KSTopic!tag1,其中“KSDdeserver|KSTopic!”项是固定形式,如图所示

微信交流 6686496  资源整合,合作共赢.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空getmoney

微信6686496

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值