EC应用之多平台接口远程调用

在传统的网络应用编写中都是通过接收消息处理然后应答,但在.net 3.0后提供了一个基于业务接口调用的网络交互体系WCF.基于WCF .NET程序可以通过接口调用的方式进行远程业务调用处理.由于WCF是MS提供的体系,所以在mono和xamarin所支持的其他平台都没有良好地被支持.但随便着mono和xamarin的迅速发展,基于业务接口远程调用的服务体系该提供给更多平台提供通讯的便利性;为了解决这些问题EC组件提供了一套基于业务接口远程调用方法实现,借助于mono和xamarin可以使些功能简单应用到linux,android,wp和ios之上.

通过EC只需要用接口就能描述一个远程通讯操作,其原体系原理类似于WCF;由于是针对mono所支持的功能实现.所以提供了多平台的支持.下面介绍一下如何用EC构建一个多台的远程接口调用功能.

接口定义

在EC中描述服务的接口并不需要定义任何规范,不过由于基础通过是通过protobuf来实现基础RPC通讯,所以对于一些用户自定义的对象需要通过protobuf进行描述.以下是示例接口和对象结构的定义.

    public interface IUserService
   {
        User Register(string name, string email);
        void GetRegisteTime(string name, out DateTime time);
    }
    [ProtoContract]
    [EC.MessageID(0x0001)]
    public class User
    {
        [ProtoMember(1)]
        public string Name { get; set; }
        [ProtoMember(2)]
        public string Email { get; set; }
        [ProtoMember(3)]
        public DateTime CreateTime { get; set; }
    }

以上是定义一个简单用户服务接口,包括的功能用注册和获取用户注册时间.EC不紧紧提供普通参数成员的支持,同样也提供对out参数的支持.

服务实现

在前面已经有文章介绍EC如果开启一个网服务,在不需要任何配置的情况即可开启,包括现有介绍的远程接口调用功能.你只需要在实现远程接口的类上打上一个SOAServer标答在EC启的时候就会自动加载并运行.具体代码如下:

    [EC.Remoting.SOAService(typeof(IUserService))]
   class Program:IUserService
    {
        static void Main(string[] args)
        {
            EC.ECServer.Open();
            System.Threading.Thread.Sleep(-1);
        }

       public User Register(string name, string email)
        {
            Console.WriteLine("register name:{0}\t email:{1}", name, email);
            User user = new User();
            user.Name = name;
            user.Email = email;
            user.CreateTime = DateTime.Now;
            return user;
        }

       public  void GetRegisteTime(string name, out DateTime time)
        {

            time = DateTime.Now;
            Console.WriteLine("get registe time:{0}", time);
        }
    }

以上代码是不是非常简单,只需要实现接口那服务就自然会加载处理.

客户端

EC同时提供简单的功能库来处理接口远程调用,只需要引用接口和自定义的参数类型即可以.并不需要去实现接口来调用.组件会根据接口内部构建一个代理调从而简化客户端调用繁琐性.

        public partial class Form1 : Form

   {
        public Form1()
        {
            InitializeComponent();
        }

        private ProtoClient mChannel = new ProtoClient("127.0.0.1", 10034);

        private IUserService UserService;

        private void Form1_Load(object sender, EventArgs e)
        {
            UserService = mChannel.CreateInstance<IUserService>();
        }

        private void btnRegister_Click(object sender, EventArgs e)
        {
          btnRegister.Text="Register(+" + UserService.Register(txtName.Text,txtEMail.Text).CreateTime+")";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            DateTime dt;
            UserService.GetRegisteTime("test",out dt);
            button2.Text="GetTime(" + dt+")";
        }
    }

直接构建一个ProtoClient的客户端对象,然后通过客户端对象创建一个代理操作接口即可;对象是不需要关系连接的有效性,接口代理内部会根据连接的情况来确认在调用的时候是否需要便建连接.

Android

EC同样提供xamarin的功能库,不过不象.NET平台那样提供protobuf和msgpack的支持;所以在使用上会有一些差异由于只支持protobuf所以xamarin下提供了ServiceChannel这样一个对象来代码原来的ProtoClient,虽然名称 不一样不过功能还是一致的.

 [Activity (Label = "EC.InterfaceProxy", MainLauncher = true, Icon = "@drawable/icon")]

	public class MainActivity : Activity
	{

		private EC.ServiceChannel mChannel = new ServiceChannel("10.0.2.2",10034);

		private IUserService UserService;

		protected override void OnCreate (Bundle bundle)
		{
			base.OnCreate (bundle);
			ServiceChannel.Register (typeof(MainActivity).Assembly);
			UserService = mChannel.CreateInstance<IUserService> ();
			// Set our view from the "main" layout resource
			SetContentView (Resource.Layout.Main);
			EditText name = this.FindViewById<EditText> (Resource.Id.txtName);
			EditText email = this.FindViewById<EditText> (Resource.Id.txtEMail);
			Button register = this.FindViewById<Button> (Resource.Id.cmdRegister);
			register.Click += delegate {
				register.Text ="Register(" + UserService.Register(name.Text,email.Text).CreateTime+")";

			};
			Button gettime = this.FindViewById<Button> (Resource.Id.cmdGetTime);
			gettime.Click += delegate {
				DateTime dt;
				UserService.GetRegisteTime ("test", out dt);
				gettime.Text = "GETTIME(" + dt + ")";
			};
			// Get our button from the layout resource,
			// and attach an event to it

		}
	}

整体调用都一样,不过有一个地方需要注意的就是在移动平台下需要调用ServiceChannel.Register功能把用户自定义的消息类型注册到组件中,主要是保证protobuf在RPC处理过程能解决用户的自定义类型.

总结

由于EC基于标准的托管库实现的同时也兼容mono,所以通过EC编写的通讯功能都可以运行在windows和linux之下.如果你有移动平台的需要借助于xamarin可以轻易地应用在android,ios和wp的移动系统之上.

下载完整示例

时间: 2024-10-18 02:10:56

EC应用之多平台接口远程调用的相关文章

WebService与RMI(远程调用方式实现系统间通信)

前言 本文是<分布式java应用基础与实践>读书笔记:另外参考了此博客,感觉讲的挺好的,尤其是其中如下内容: 另外,消息方式实现系统间通信本文不涉及.RMI则只采用spring RMI框架来实现效果,更多的则是来讲讲webService及效果. RMI(Remote Method Invocation) ----> spring RMI(配置及实现直接参考spring文档,已经很详细了) spring RMI工作原理图如下: RMI代码结构图: 服务端代码 接口Business.java

远程调用内核接口的封装类(RCKObjs)

RCK 包含 Application, Function, Connection, Command, Response 和 Fields 六 大类, 其主要功能如下: a. Application 类主要负责 Function 的组织和 Response 的分发执行: b. Function    类主要负责 Function 的定义及按各模式调用: c. Connection  类主要负责登录对端应用, Command 请求执行, Response 应答管理, 以及发送和接收数据等等: d.

云极知客开放平台接口调用方法(C#)

云极知客为企业提供基于SAAS的智能问答服务.支持企业个性化知识库的快速导入,借助语义模型的理解和分析,使企业客户立即就拥有本行业的24小时客服小专家.其SAAS模式实现零成本投入下的实时客服数据的可视化,优化企业业务流程,指导企业决策. 说白了,其实就是一个智能客服机器人,你可以和他聊天,也可以和他扯淡,但重要的是,你可以用他为客服,教他东西,解放自己.OK,广告到此,下面看看接口相关的东西. 云极知客的接口文档请点击这里. 以下使用C#.NET介绍两个接口的调用方法,平台接口均设置为POST

android客户端与服务器交互数据(基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合)

在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,做过JAVA ME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用,当然KSOAP已经提供了基于android版本的jar包 首先下载KSOAP包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包 然后新建android项目 以

RPC的发展历史(本质就是双方定义好协议,传递参数后远程调用)

服务器通讯原理就是一台socket服务器A,另一台socket客户端B,现在如果要通讯的话直接以流方式写入或读出. 这样能实现通讯,但有个问题.如何知道更多信息?比如需要发送流大小,编码,Ip等. 这样就有了协议,协议就是规范,就是发送的流中携带了很多的内容. RPC的实现就是一种规范.可参考http://javatar.iteye.com/blog/1123915 这个简单RPC实现. RPC(远程过程调用)是什么 简单的说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服

.Net组件程序设计之远程调用(一)

.Net组件程序设计之远程调用(一) 1应用程序域 我们知道我们写的C#代码是在操作系统逻辑体系结构中最上层的,然而操作系统本身是不会认识C#代码的,它只认识机器代码.那我们写的程序经过编译后是编译成IL的,是怎么运行的呢?实际是在一个托管的环境下运行的,是.NET提供的支持,操作系统是不会识别IL的,这中间就需要一个桥梁:应用程序域.操作系统中的进程是资源单位,应用程序域的执行使用当然也要占用空间使用资源了,所以是物理进程承载着应用程序域的,而且这种承载关系并不是一对一的. 图:应用程序域 使

Java[2] 分布式服务架构之java远程调用技术浅析(转http://www.uml.org.cn/zjjs/201208011.asp)

转自:http://www.uml.org.cn/zjjs/201208011.asp 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来一探究竟,抛

【PHP】远程调用以及RPC框架

前言 一个项目,从开始到版本更新,一直到最后的版本维护.功能在不断增多,对应的代码量也在不断增加,也就意味着项目变得更不可维护,这时候,我们需要用拆分的方式将一个项目打散,以便开发团队更好的对项目进行维护. 分模块 这个阶段,一般也是项目的初级阶段,由于人手不够,一个服务端的接口项目只有一个开发进行维护,根据开发的习惯,会把项目分成若干个模块进行开发,在一个项目下进行部署. 这样做的缺点在于项目会随着版本更新而变得不可维护. 分项目 随着每个模块功能的不断完善,代码变得更加臃肿.这时候需要对项目

.Net 与 Java 的服务接口相互调用

本文介绍.Net 与 Java 相互调用的例子.下面的介绍主要包括三方面:一是通过常用Web服务进行相互调用,二是使用TCP/IP套接字进行相互调用,三是使用Remote实现远程对象相互调用. 首先说一下Web服务的来源,Web服务是一种新的Web应用程序分支,可以执行从简单的请求到复杂商务处理等任何功能.一旦部署以后,其他Web服务应用程序可以发现并调用它部署的服务. Web Service是一种应用程序,它可以使用标准的互联网协议,像超文件传输协议(HTTP).简单对象访问协议(SOAP).