当前位置: 首页 > news >正文

C# 部署ICE框架以及用例(VS2019)

使用Windows 10环境,VS2019进行ICE用例开发

用例结构:客户端和服务端

关键技术:集成ICE环境,可以创建ice文件并自动生成对应的cs文件

1.环境安装

ICE Build插件安装。安装以后,就可以在项目中插入ice文件

2.代码实现

   创建两个控制台程序(Client和Server),基于.Net FrameWork 4.6.1平台。

    分别在Nuget中进行引用

    然后,创建ICE文件,文件内容如下

#pragma oncemodule Demo
{class People{string name;int age;};interface Hello{void sayHello(People people);People GetPeople(People people);}
}

接着分别生成项目。就会自动生成generated文件夹

                    

然后实现服务端服务

namespace Server
{public class PrinterI : Demo.HelloDisp_{public override People GetPeople(People people, Current current = null){return people;}public override void sayHello(People people, Current current = null){Console.WriteLine(people.name+"今年已经"+people.age+"岁啦!");}}
}

服务端启动代码

class Program{static void Main(string[] args){try{using (Ice.Communicator communicator = Ice.Util.initialize()){var adapter =communicator.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -h localhost -p 10000");adapter.add(new PrinterI(), Ice.Util.stringToIdentity("SimplePrinter"));adapter.activate();Console.WriteLine("启动成功");communicator.waitForShutdown();Console.ReadLine();}}catch (Exception er){Console.Error.WriteLine(er);return;}}}

最后在客户端进行调用;

 class Program{static void Main(string[] args){try{using (Ice.Communicator communicator = Ice.Util.initialize()){var obj = communicator.stringToProxy("SimplePrinter:default -h localhost -p 10000");var printer = HelloPrxHelper.checkedCast(obj);if (printer == null){throw new ApplicationException("Invalid proxy");}People people = new People() { Name = "小王", Age = 99 , Sex = "nv"};printer.sayHello(people);var res = printer.GetPeople(people);Console.WriteLine(res.Name+"--"+ res.Address+"--"+ res.Sex);Console.ReadLine();}}catch (Exception ex){Console.Error.WriteLine(ex.Message);return;}}}

        小伙伴可能已经发现,客户端的People对象和ice文件中定义的People对象不一样,实际上,在客户端本地新建文件使用部分类定义的形式对自动生成的People对象进行了扩充实验。

    public partial class People : IPeople{public int Age { get => this.age; set => this.age = value; }public string Address { get => this.name;  }public string Name { get => this.name; set => this.name = value; }string sex;public string Sex { get => this.sex; set => this.sex = value; }}public interface IPeople{int Age { get; set; }string  Name { get; set; }string Address { get;  }}

那么扩充有什么作用?扩充People对象,可以满足客户端实现更加灵活的业务,不必要和服务端的People定义完全一致,可以正常通讯的前提是,客户端和服务端都是使用相同的ice文件生成的,并且客户端扩充的People对象需要和服务端存在相同名称的成员。(允许客户端和服务端相同成员的访问级别不一致)

允许通信的原因是?ICE无法识别客户端的这种改变?从侧面验证了Ice运行过程中,对对象的赋值是按照字段或者属性名称的,不是整体序列化?

附官方用例:Writing an Ice Application with C-Sharp - Iceicon-default.png?t=N7T8https://doc.zeroc.com/ice/3.7/hello-world-application/writing-an-ice-application-with-c-sharp

http://www.lryc.cn/news/319617.html

相关文章:

  • PostgreSQL 数据加密怎么弄,应该用哪种方案
  • 1.通过AD组策略如何做封禁高危端口的策略?AD域控如何给加域的电脑做指定端口号封禁呢?
  • 05.BOM对象
  • 【Golang星辰图】Go语言游戏开发:选择合适的库加速你的开发过程
  • 51单片机-AT24C02(I2C总线)
  • 面试经典-MySQL篇
  • C#控制台贪吃蛇
  • [小程序开发] 构造页面
  • 安装Android Studio遇到Unable to access Android SDK add-on list的错误
  • EXCEL+PYTHON学习3
  • Rabbit MQ详解
  • uniapp 写安卓app,运行到手机端 调试
  • uniapp 实现双击点赞出现特效
  • 分布式搜索引擎elasticsearch(2)
  • 如何实现一个栈或队列?
  • STM32输入捕获频率和占空比proteus仿真失败
  • Kafka-SSL笔记整理
  • Mysql挂掉怎么办
  • 《工厂模式(极简c++)》
  • 前端学习笔记|JavaScript基础
  • springcloud五大组件:Eureka:注册中心、Zuul:服务网关、Ribbon:负载均衡、Feign:服务调用、Hystix:熔断器
  • Python的Selenium库中的模块、类和异常的汇总
  • 智慧交通:构建智慧城市的重要一环
  • BFS 求解 最小高度树 【妙用】
  • 【机器学习300问】36、什么是集成学习?
  • Stargo 管理部署 Starrocks 集群
  • CI/CD实战-git工具使用 1
  • Linux中udp服务端,客户端的开发
  • 1.python安装
  • 【Flink SQL】Flink SQL 基础概念(三):SQL 动态表 连续查询