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.\;%PATH% >> iceout.txt echo Calling slice2cs on Printer.ice >> iceout.txt
slice2cs.exe --output-dir $(ProjectDir)ICEGenerated $(ProjectDir)Printer.ice >> iceout.txt >&
第一条是 预编译结果输出,成功失败异常等
第二条是开始预编译(自动生成接口文件相关)
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(,);
} public MyServer()
{
Ice.Communicator _ICEComm = Ice.Util.initialize();
Ice.Communicator iceComm = Ice.Util.initialize(); Ice.ObjectAdapter iceAdapter = iceComm.createObjectAdapterWithEndpoints("ServerProxy", "tcp -p " + "");
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}", , , "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();
}
} 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>
ICE框架双工通讯+MVVM框架测试案例的更多相关文章
- 前端MVVM框架设计及实现
最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了 借鉴的自然还是从正美的Avalon开始了,我2013年写过一个关于MVC MV ...
- 迷你MVVM框架 avalonjs 入门教程
新官网 请不要无视这里,这里都是链接,可以点的 OniUI组件库 学习教程 视频教程: 地址1 地址2 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定 作用域绑定(ms-contro ...
- 迷你MVVM框架 avalonjs1.5 入门教程
avalon经过几年以后,已成为国内一个举足轻重的框架.它提供了多种不同的版本,满足不同人群的需要.比如avalon.js支持IE6等老旧浏览器,让许多靠政府项目或对兼容性要求够高的公司也能享受MVV ...
- .NET Core 3 WPF MVVM框架 Prism系列之模块化
本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的应用程序的模块化 前言 我们都知道,为了构成一个低耦合,高内聚的应用程序,我们会分层,拿一个WPF程序来说,我们通过MVVM模式 ...
- MVVM框架从WPF移植到UWP遇到的问题和解决方法
MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...
- “老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春
火热的MVVM框架 最近几年最热门的技术之一就是前端技术了,各种前端框架,前端标准和前端设计风格层出不穷,而在众多前端框架中具有MVC,MVVM功能的框架成为耀眼新星,比如GitHub关注度很高的Vu ...
- 前端MVVM框架设计及实现(一)
最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了 借鉴的自然还是从正美的avalon开始了,我记得还是去年6月写过一个系列的av ...
- 【iOS】小项目框架设计(ReactiveCocoa+MVVM+AFNetworking+FMDB)
上一个项目使用到了ReactiveCocoa+MVVM+AFNetworking+FMDB框架设计,从最初的尝试,到后来不断思考和学习,现在对这样一个整体设计还是有了一定了理解与心得.在此与大家分享下 ...
- 使用MVVM框架(avalonJS)进行快速开发
背景 在运营活动开发中,因为工作的重复性很大,同时往往开发时间短,某些情况下也会非常紧急,导致了活动开发时间被大大压缩,同时有些活动逻辑复杂,数据或者状态变更都需要手动渲染,容易出错,正是因为这些问题 ...
随机推荐
- Centos7.4 防火墙配置
# service firewalld status; #查看防火墙状态 (disabled 表明 已经禁止开启启动 enable 表示开机自启,inactive 表示防火墙关闭状态 activate ...
- ArrayList、LinkedList和vector的区别
1.ArrayList和Vector都是数组存储,插入数据涉及到数组元素移动等操作,所以比较慢,因为有下标,所以查找起来非常的快. LinkedList是双向链表存储,插入时只需要记录本项的前后项,查 ...
- nodejs中的垃圾回收机制
node是基于V8引擎开发的,V8的设计是为浏览器设计的,所以V8的内存相对较少,当然可以通过 node --max-old-space-size=1700 (单位是MB) 或 node --max- ...
- Django JWT Token RestfulAPI用户认证
一般情况下我们Django默认的用户系统是满足不了我们的需求的,那么我们会对他做一定的扩展 创建用户项目 python manage.py startapp users 添加项目apps INSTAL ...
- iview中,table组件在缩进时产生的bug。
问题描述: 在父元素因为缩进的关系撑开时,table组件不会因为父元素的撑开而自适应,问题如图 解决办法:在父一级的组件中使用table {width: 100% !important},强制使表格宽 ...
- Visual C++ 6.0中if的简单用法
# include<stdio.h> int main (void) { > ) printf("AAAA"); printf("BBBB") ...
- ubuntu下绑定串口
查看有哪些设备连接在你的电脑上 lsusb 得到如图: 查看usb串口上连接的信息,得到不一样的信息 dmesg | grep ttyS* 我使用了一个usb扩展器,这边可以看到,被连接在ttyUSB ...
- window10单机安装storm集群
适合范围:storm自由开源的分布式实时计算系统,擅长处理海量数据.适合处理实时数据而不是批处理. 安装前的准备 1.安装zookeeper ①下载zookeeperhttps://zookeeper ...
- Map的嵌套 练习
Map的嵌套 练习 利用迭代和增强for循环的两种方式实现如下效果 package cn.ccc; import java.util.HashMap;import java.util.Iterat ...
- ubuntu16.04中如何启用floodlight的其中一种方式
1. 提前一台安装好mininet,另一台安装好floodlight 2. 在mininet里面的custom文件夹下自定义文件ProjectGroup10_Topology.py from mini ...