ICE框架双工通讯+MVVM框架测试案例

准备

开发工具 VS2015

ICE框架 https://zeroc.com/

MVVMLight框架

ICE接口文件

#include "./Identity.ice"
#include "./CommonIPC.ice"

module Demo {
    interface ServerProxy {
        void Register(Ice::Identity ident);
        int GetResultFromServer();
    };

    interface ClientProxy {
        bool SendToClient(string i);
    };
};

预编译指令 (BuildEvent)

echo Setting path for Pre-build event  > iceout.txt
set PATH=$(SolutionDir)3.6.2\;%PATH% >> iceout.txt

echo Calling slice2cs on Printer.ice >> iceout.txt
slice2cs.exe --output-dir $(ProjectDir)ICEGenerated $(ProjectDir)Printer.ice >> iceout.txt 2>&1

第一条是 预编译结果输出,成功失败异常等

第二条是开始预编译(自动生成接口文件相关)

Server端实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ice;
using System.Collections;
using Demo;

namespace ICETest
{
    public class MyServer : Demo.ServerProxyDisp_
    {
        /// <summary>
        /// 客户端维护
        /// </summary>
        ArrayList _Clients = new ArrayList();
        /// <summary>
        /// 开发给客户端调用的接口,获取随机数
        /// </summary>
        /// <param name="current__"></param>
        /// <returns></returns>
        public override int GetResultFromServer(Current current__)
        {
            var r = new Random();
            Console.WriteLine("客户端获取随机数成功");
            return r.Next(0,100);
        }

        public MyServer()
        {
            Ice.Communicator  _ICEComm = Ice.Util.initialize();
            Ice.Communicator iceComm = Ice.Util.initialize();

            Ice.ObjectAdapter iceAdapter = iceComm.createObjectAdapterWithEndpoints("ServerProxy", "tcp -p " + "10000");
            iceAdapter.add(this, iceComm.stringToIdentity("ServerProxy"));
            iceAdapter.activate();
        }
        /// <summary>
        /// 接收客户端注册,并维护客户端
        /// </summary>
        /// <param name="ident"></param>
        /// <param name="current__"></param>
        public override void Register(Identity ident, Current current__)
        {
            Ice.ObjectPrx @base = current__.con.createProxy(ident);
            ClientProxyPrx client = ClientProxyPrxHelper.uncheckedCast(@base);
            _Clients.Add(client);
            Console.WriteLine("一个新的客户端已经连接");
        }

        /// <summary>
        /// 给客户端发送信息
        /// </summary>
        /// <param name="s"></param>
        public void SendToClient(string s)
        {
            foreach (var item in _Clients)
            {
                var c = item as ClientProxyPrxHelper;
                c.SendToClient(s);
                Console.WriteLine("发送给客户端:" + s);
            }
        }
    }
}

Client实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Demo;
using Ice;

namespace MVVMTest
{
    public class MyClient : ClientProxyDisp_
    {

        public event EventHandler Receivedata;
        /// <summary>
        /// 由服务端主动发送过来的数据,通过事件提醒界面更新
        /// </summary>
        /// <param name="i"></param>
        /// <param name="current__"></param>
        /// <returns></returns>
        public override bool SendToClient(string i, Current current__)
        {
            II1 = i;
            if(Receivedata!=null)
            {
                Receivedata(null, null);
            }
            return true;
        }

        public string II1 { get; set; }

        ServerProxyPrx _serverpxy = null;
        Ice.Communicator _ICEComm = null;
        public MyClient()
        {
            _ICEComm = Ice.Util.initialize();
            string connectString = String.Format("ServerProxy:tcp -t {0} -p {1} -h {2}", 100000, 10000, "172.16.35.66");
            ObjectPrx iceProxy = _ICEComm.stringToProxy(connectString);
            _serverpxy = ServerProxyPrxHelper.checkedCast(iceProxy);
        }
        /// <summary>
        /// 由VM层多线程调用,循环执行
        /// </summary>
        /// <returns></returns>
        public  int GetResultFromServer( )
        {
            return _serverpxy.GetResultFromServer();
        }
        /// <summary>
        /// 初次注册自己
        /// </summary>
        public void Register()
        {
            Ice.ObjectAdapter adapter = _ICEComm.createObjectAdapter("");
            Ice.Identity ident = new Identity();
            ident.name =new Guid().ToString();
            ident.category = "";
            adapter.add(this, ident);
            adapter.activate();
            _serverpxy.ice_getConnection().setAdapter(adapter);

            _serverpxy.Register(ident);
        }
    }
}

Client ----VM实现

using GalaSoft.MvvmLight;
using System.ComponentModel;
using System.Threading;

namespace MVVMTest.ViewModel
{
    /// <summary>
    /// This class contains properties that the main View can data bind to.
    /// <para>
    /// Use the <strong>mvvminpc</strong> snippet to add bindable properties to this ViewModel.
    /// </para>
    /// <para>
    /// You can also use Blend to data bind with the tool‘s support.
    /// </para>
    /// <para>
    /// See http://www.galasoft.ch/mvvm
    /// </para>
    /// </summary>
    public class MainViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            client = new MyClient();
            client.Receivedata += Client_Receivedata;

            client.Register();
            // Code runs in Blend --> create design time data.
            BackgroundWorker bg = new BackgroundWorker();
            bg.DoWork += Bg_DoWork;
            bg.RunWorkerAsync();
        }

        private void Client_Receivedata(object sender, System.EventArgs e)
        {
            RaisePropertyChanged("Test2");
        }

        MyClient client = null;
        private void Bg_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                Test1 = client.GetResultFromServer().ToString();
                RaisePropertyChanged("Test1");
                Thread.Sleep(5000);
            }
        }

        public string Test1
        {
            get; set;
        }

        public string Test2
        {
            get { return client.II1; }
        }
    }
}

Client View实现

<Window x:Class="MVVMTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MVVMTest"
        mc:Ignorable="d"
        DataContext="{Binding Main,Source={StaticResource Locator}}"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Label x:Name="label1" Content="{Binding Path=Test1, Mode=OneWay}"   HorizontalAlignment="Left" Margin="64,189,0,0" VerticalAlignment="Top" Height="35" Width="222" Background="Yellow"/>
        <Label x:Name="label2" Content="{Binding Path=Test2, Mode=OneWay}"   HorizontalAlignment="Left" Margin="72,114,0,0" VerticalAlignment="Top" Height="35" Width="222" Background="AliceBlue"/>
    </Grid>
</Window>
时间: 2024-08-26 00:29:13

ICE框架双工通讯+MVVM框架测试案例的相关文章

迷你MVVM框架 avalonjs 入门教程(司徒正美)

迷你MVVM框架 avalonjs 入门教程 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定属性与动态模板 作用域绑定(ms-controller, ms-important) 模板绑定(ms-include) 数据填充(ms-text, ms-html) 类名切换(ms-class, ms-hover, ms-active) 事件绑定(ms-on,……) 显示绑定(ms-visible) 插入绑定(ms-if) 双工绑定(ms-duplex) 样式绑定(ms-css) 数据绑

迷你MVVM框架 avalonjs1.5 入门教程

avalon经过几年以后,已成为国内一个举足轻重的框架.它提供了多种不同的版本,满足不同人群的需要.比如avalon.js支持IE6等老旧浏览器,让许多靠政府项目或对兼容性要求够高的公司也能享受MVVM的乐趣.avalon.modern.js支持IE10以上版本,优先使用新API,性能更优,体积更少.avalon.mobile.js在avalon.modern的基础提供了触屏事件的支持,满足大家在移动开发的需求.此外,它们分别存在avalon.xxx.shim版本,指无自带加载器版,avalon

使用MVVM框架(avalonJS)快速开发运营活动

背景 在运营活动开发中,因为工作的重复性很大,同时往往开发时间短,某些情况下也会非常紧急,导致了活动开发时间被大大压缩,同时有些活动逻辑复杂,数据或者状态变更都需要手动渲染,容易出错,正是因为这些问题的存在,所以才有了MV*框架的诞生,比如大名鼎鼎的angularJS.今天就跟大家讲讲国产的MVVM框架avalonJS是如何快速进行开发的,同时大家也可以对比石器时代的开发模式(jquery或者zepto)与mv*模式的区别. avalonJS简介 avalonJS是前端大牛司徒正美开发和维护的m

“老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春

火热的MVVM框架 最近2年最热门的技术之一就是前端技术了,各种前端框架,前端标准和前端设计风格层出不穷,而在众多前端框架中具有MVC,MVVM功能都框架成为耀眼新星,比如GitHub关注度很高的Vue.js ,由于是国人作品,其设计风格和文档友好度对国人而言更胜一筹,因此我也将它推荐到公司采用,其中我推荐都理由就是它非常优秀的MVVM功能,面向数据而不是面向DOM细节相比jQuery等更加节省代码,更符合后端程序员的胃口,也更有利于UI设计人员跟程序员都分工配合. 下面是Vue.js实现MVV

【iOS】小项目框架设计(ReactiveCocoa+MVVM+AFNetworking+FMDB)

网址: http://www.saitjr.com/ios/ios-framework-reactivecocoa-mvvmafnetworking-fmdb.html 上一个项目使用到了ReactiveCocoa+MVVM+AFNetworking+FMDB框架设计,从最初的尝试,到后来不断思考和学习,现在对这样一个整体设计还是有了一定了理解与心得.在此与大家分享下. 本文将不再过多的描述ReactiveCocoa.MVVM.FMDB的使用细节.关于ReactiveCocoa,我有一篇实用案例

js架构设计模式——前端MVVM框架设计及实现(一)

前端MVVM框架设计及实现(一) 最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了 借鉴的自然还是从正美的avalon开始了,我记得还是去年6月写过一个系列的avalon源码分析的,不过那时候0.7版本,不够健全,现在已经好太多了 框架是面向一个领域,提供一套解决方案,那么我们用前端的MVVM能为我们带来什么便利? 关注点分离 操作数据即操作DOM 动态模板 关注点分离是MVVM与身俱来的,操作数据即操作DOM,是VM中的访

迷你MVVM框架 avalonjs 1.3.2发布

时隔一个月,avalon的新版本终于出来了,本次更新带来强大的模块间通信机制,其他就往常一样FIX BUG. 在文本绑定里,IE会对流离于DOM树外的文本节点的data属性赋值报错,需要添加一层判定 派发事件的逻辑,由DOC.createEvent("Event")必成DOC.createEvent("Events") 添加一个反XSS的过滤器sanitize 重构事件系统,暴露eventHooks对象 firefox添加对mousewheel的兼容支持 升级ms-

迷你MVVM框架 avalonjs 1.3.6发布

本版本是一次重要的升级,考虑要介绍许多东西,也有许多东西对大家有用,也发到首页上来了. 本来是没有1.36的,先把基于静态收集依赖的1.4设计出来后,发现改动太多,为了平缓升级起见,才减少了一部分新特性,做成1.36.因此是先有1.4,才有1.36. 本版本针对公司(去哪儿网,毕竟是带薪在公司里搞这框架)的访问浏览器的占有率,加大对国产浏览器的测试.涉及浏览器有QQ浏览器, 搜狗浏览器, 猎豹浏览器, 傲游浏览器,但没有360浏览器,我们公司的同事还是很注意安全的.这么多浏览器,现在还差两个ca

Android MVVM框架RoboBinding初探

RoboBinding是一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架.MVVM模式是MVC模式的重要更新,使得项目结构更加的优美,易于维护以及方便于测试.这也是为什么几个主流的语言都有相应的MVVM框架实现如windows phone,WPF,Silverlight,JavaFX以及Flex. 在没有性能损失的前提下(使用AspectJ字节码生成来替代Java反射),RoboBinding 帮助你编写更可读,易于测试与维护的UI代码.框架具备