跨平台开源通讯组件elastic communication

elastic communication是基于c#开发支持.net和mono的通讯组件(简称EC),EC的主要目的简化mono和.net下的通讯开发难度,通过EC可以非常快速地开发基于mono和.net的通讯交互应用。EC抽取的基础的通讯协议默认支持protobuf,msgpack的数据对象进行通讯交互,开发者不可以根据自己的制要制订更多的序列化方式支持;EC不紧紧支持简单的对像传输,还提供了控制器,方法控制器和更方便的远程接口调用功能。

    以下是ES希望实现的最终目标

    

    借助于Xamarin实现不同移动端的实现,由于这一块个人工作原因还没细化实现,通过开源相关代码可以让感兴趣的人更好进一步去完成相关功能。

功能简介

    EC实现通讯功能是非常方便的事情,下面通讯简单的几种场景来介绍一下EC在通讯上的应用。

HelloWord

  • 服务端

    namespace HelloWord.Server
    {
    [Controller]
    public class Program
    {
    static void Main(string[] args)
    {
    ECServer.Open();
    System.Threading.Thread.Sleep(-1);
    } public string HelloWord(ISession session,Hello e)
    {
    return string.Format("hello {0} [say time:{1}]", e.Name, DateTime.Now);
    }
    } [MessageID(0x1)]
    [ProtoContract]
    public class Hello
    {
    [ProtoMember(1)]
    public string Name { get; set; }
    }
    }
  • 客户端
    private EC.ProtoSyncClient mClient = new ProtoSyncClient("127.0.0.1");
    mClient.Send<string>(new Hello { Name=textBox1.Text })

远程方法访问

  EC支持远程方法调用,如果用过wcf那对这功能感觉应该不会陌生,而EC也是通过接口的方式来定义远程调用行为;wcf同一方法重载需要重新定义名称,而ec则支持同一方法多个重载版本。为了满足更复杂的需要,EC的远程调用同样支持out和ref参数。

  • 接口定义

    namespace Remoting.Service
    {
    public interface IUserService
    {
    User Register(string name, string email);
    }
    }
  • 服务端
    [SOAService(typeof(Service.IUserService))]
    class Program : IUserService
    {
    static void Main(string[] args)
    {
    ECServer.Open();
    System.Threading.Thread.Sleep(-1);
    } public Service.User Register(string name, string email)
    {
    User user = new User();
    user.EMail = email;
    user.Name = name;
    user.CreateTime = DateTime.Now;
    return user;
    }
    }
  • 客户端
      public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    } private ProtoClient mClient = new ProtoClient("192.168.7.111"); private IUserService UserService; private void Form1_Load(object sender, EventArgs e)
    {
    UserService = mClient.CreateInstance<IUserService>();
    } private void cmdRegister_Click(object sender, EventArgs e)
    {
    User user= UserService.Register(txtName.Text, txtEMail.Text);
    txtCreateTime.Text = user.CreateTime.ToString();
    }
    }

数据访问示例

   数据访问应该是最常见的一种应用场,以下是定义一个简单的数据查询示例。

  • 服务端

     [EC.Controller]
    public class Program
    {
    static void Main(string[] args)
    {
    DBContext.SetConnectionDriver<SqliteDriver>(DB.DB1);
    DBContext.SetConnectionString(DB.DB1, "Data Source=northwindEF.db;Pooling=true;FailIfMissing=false;");
    ECServer.Open();
    System.Threading.Thread.Sleep(-1);
    } public IList<Employee> OnEmployeeSearch(ISession session, EmployeeSearch e)
    {
    return new Expression().List<Models.Employees, Employee>();
    } public IList<Customer> OnCustomerSearch(ISession session, CustomerSearch e)
    {
    return new Expression().List<Models.Customers, Customer>();
    } public IList<Order> OnOrderSearch(ISession session, OrderSearch e)
    {
    Expression exp = new Expression();
    if (e.CustomerID != null)
    exp &= Models.Orders.customerID == e.CustomerID;
    if (e.EmployeeID > 0)
    exp &= Models.Orders.employeeID == e.EmployeeID;
    return exp.List<Models.Orders, Order>();
    } public IList<OrderDetail> GetOrderDetail(ISession session, GetDetail e)
    {
    Expression exp = Models.OrderDetails.orderID == e.OrderID;
    JoinTable jt = Models.OrderDetails.productID.InnerJoin(Models.Products.productID);
    jt.Select("OrderDetails.*", Models.Products.productName.Name);
    return exp.List<OrderDetail>(jt);
    } }
  • 客户端
    private ProtoSyncClient mClient = new ProtoSyncClient("127.0.0.1");
    
            private void FrmMain_Load(object sender, EventArgs e)
    {
    cbEmployees.Items.Add(new Employee());
    foreach (Employee item in mClient.Send<IList<Employee>>(new EmployeeSearch()))
    {
    cbEmployees.Items.Add(item);
    }
    cbCustomers.Items.Add(new Customer());
    foreach (Customer item in mClient.Send<IList<Customer>>(new CustomerSearch()))
    {
    cbCustomers.Items.Add(item);
    } } private void cmdSearch_Click(object sender, EventArgs e)
    {
    OrderSearch os = new OrderSearch();
    if (cbCustomers.SelectedItem != null)
    os.CustomerID = ((Customer)cbCustomers.SelectedItem).CustomerID;
    if (cbEmployees.SelectedItem != null)
    os.EmployeeID = ((Employee)cbEmployees.SelectedItem).EmployeeID;
    gdOrder.DataSource = mClient.Send<IList<Order>>(os);
    } private void gdOrder_SelectionChanged(object sender, EventArgs e)
    {
    if (gdOrder.SelectedRows.Count > 0)
    {
    Order order = (Order)gdOrder.SelectedRows[0].DataBoundItem;
    GetDetail getdetail = new GetDetail();
    getdetail.OrderID = order.OrderID;
    gdDetail.DataSource = mClient.Send<IList<OrderDetail>>(getdetail);
    }
    }

AppModule

    AppModule类似于asp.net的httpModule,它可以在EC服务中载实始化的时候进行加载,通过AppModule可以实现消息处理,处理日志,全局信息定义等相关主要功能。

    public class FilterModel : IAppModel
{ public string Name
{
get { return "Filter"; }
} private System.Threading.Timer mTimer; public void Init(IApplication application)
{
//application.Filters.Add(new LoginFilter());
application.Disconnected += (o, e) =>
{
"{0} disposed applicaion event".Log4Info(e.Session.Channel.EndPoint); };
application.Connected += (o, e) =>
{ "{0} connect applicaion event".Log4Info(e.ChannelConnectArgs.Channel.EndPoint); };
application.SendCompleted += (o, e) =>
{
"{0} send completed applicaion event".Log4Info(e.Session.Channel.EndPoint);
};
application.MethodProcess += (o, e) =>
{
//application
e.Application["Path"] = @"c:\";
//sexxion
e.Session["folder"] = "aaa";
};
application.Error += (o, e) =>
{
"{0} channel error {1}".Log4Error(e.Info.Channel.EndPoint, e.Info.Error.Message);
};
mTimer = new System.Threading.Timer(o =>
{
application.Server.Send(new User { Name = Guid.NewGuid().ToString("N"),CreateTime = DateTime.Now }, application.Server.GetOnlines());
}, null, 1000, 1000); }
public string Command(string cmd)
{
throw new NotImplementedException();
}
}

Filter

    这个特性在EC上是提供比较有用的功能,通讯filter可以对调用方法加入权限,日志,拦载等逻辑功能。  

public class AdminFilter : FilterAttribute
{
public override void Execute(IMethodContext context)
{
"admin filter ->{0}".Log4Debug(context.Handler);
base.Execute(context);
}
}
[Controller]
public class Controller
{
[SkipFilter(typeof(LoginFilter))]
[ThreadPool]
public User Regisetr(ISession session, User user)
{
user.CreateTime = DateTime.Now;
"Register invoke[Name:{0} Email:{1}]".Log4Debug(user.Name, user.EMail); return user;
} [AdminFilter]
public IList<User> Search(ISession session, Query query)
{
"Search invoke".Log4Debug();
List<User> users = new List<User>();
users.Add(new User());
users.Add(new User());
return users;
}
}

开源地址

  https://github.com/IKende/ec/

  https://github.com/IKende/ec/tree/master/Samples

开源原因

    其实我个人不太多喜欢走开源路线,主要是工作和手头上的一些产品太多,而这个产品可以说完善度已经达到90%,如果扔在那里感觉有点可惜了,所以把产品开源出来,如果有兴趣的朋友可以复制完善它。

个人站:www.ikende.com
个人开源项目github.com/IKende

基于mono elasticsearch的内容搜索平台

c#组件设计交流群:47164588 
c# socket :136485198 微博http://weibo.com/ikende

开源通讯组件ec的更多相关文章

  1. Net Core开源通讯组件 SmartRoute

    Net Core开源通讯组件 SmartRoute(服务即集群) SmartRoute是基于Dotnet Core设计的可运行在linux和windows下的服务通讯组件,其设计理念是去中心化和零配置 ...

  2. 跨平台开源通讯组件elastic communication

    elastic communication是基于c#开发支持.net和mono的通讯组件(简称EC),EC的主要目的简化mono和.net下的通讯开发难度,通过EC可以非常快速地开发基于mono和.n ...

  3. .Net Core开源通讯组件 SmartRoute(服务即集群)

    SmartRoute是基于Dotnet Core设计的可运行在linux和windows下的服务通讯组件,其设计理念是去中心化和零配置即可实现服务通讯集群.SmartRoute是通过消息订阅的机制实现 ...

  4. 突破自我,开源NetWorkSocket通讯组件

    前言 在<化茧成蝶,开源NetWorkSocket通讯组件>发表之后,收到大家很多个star,在此感谢!更可贵的是,一些网友提出了许多好建议,经过一些时间的思考,决定将NetworkSoc ...

  5. 开源NetWorkSocket通讯组件

    开源NetWorkSocket通讯组件   前言 在<化茧成蝶,开源NetWorkSocket通讯组件>发表之后,收到大家很多个star,在此感谢!更可贵的是,一些网友提出了许多好建议,经 ...

  6. [重磅开源] 比SingleR更适合的websocket 即时通讯组件---ImCore开源了

    有感而发 为什么说 SignalR 不合适做 IM? IM 的特点必定是长连接,轮训的功能用不上. 因为它是双工通讯的设计,用hub.invoke发送命令给服务端处理业务,其他就和 ajax 差不多, ...

  7. [开源] .NETCore websocket 即时通讯组件---ImCore

    前言 ImCore 是一款 .NETCore 下利用 WebSocket 实现的简易.高性能.集群即时通讯组件,支持点对点通讯.群聊通讯.上线下线事件消息等众多实用性功能. 开源地址:https:// ...

  8. 多平台Client TCP通讯组件

    Beetle.NetPackage是一个多平台Client Socket TCP通讯组件(Apache License 2.0),组件制统一的对象协议制定规则,可以灵活方便地通过对象来描述TCP通讯交 ...

  9. 自己写的中间层..基于通讯组件 RTC

    273265088 我用原生Listbox与你的组件组合...创造了奇迹..搞了一个非常复杂的 UI .. 每个item高度 包括里面的元素 以及事件都是动态的搞了好几个小时感觉UI 非常完美比客户要 ...

随机推荐

  1. sqlit使用要点之引入libsqlite3.dylib

    怎样引入libsqlite3.dylib? 在.h 或 .cpp文件里包括相应的头文件

  2. sql server2012附加的数据库问题

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjM2NzUxMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  3. poj-2195-Going Home最小费用最大流

    重新切一遍最小费用最大流~~~ 这到题目的数据范围有问题,尽量开大就好了~~ #include<stdio.h> #include<iostream> #include< ...

  4. Effective C++:条款38:通过一个复杂的模具has-a要么“基于一些实现”

    (一) public继承是"is-a"关联,"has-a"或"依据某物实现出(is-implemented-in-terms-of)"的意思 ...

  5. As long as Binbin loves Sangsang

    题目连接 题意: 给定一个无向图,每一个边有两个属性.长度和一个字母'L','O','V'.'E'中的一个.从1点開始到达n点,每次必须依照L -> O -> V -> E -> ...

  6. css样式hover图片闪烁问题

    主要是ie8及ie8以下版本浏览器会出现此问题, 问题核心是因为hover选择器没有缓存即将要替换的图片, 所以导致替换期间有一个极其短暂的空白期. 解决方案: 采用 background-posit ...

  7. swift学习一:介绍,开发文档下载

    在今天wwdc2014公布会上.苹果今天公布了全新的编程语言Swift以及新版Xcode.对于开发人员来说,Swift包括了非常多开发人员喜欢的功能,能够与Objective-C和C语言共同工作.Sw ...

  8. 手把手教popupWindow从下往上,以达到流行效果

    效果如图所看到的,点击開始button,popWindow从下往上出来,再点击popWindow外面,popWindow又从上往下消失 能够看出来,上面的popupWindow是半透明的,后面我会细说 ...

  9. 建立Hibernate二级Cache

    建立Hibernate二级Cache它需要两个步骤:首先,一定要使用什么样的数据并发策略,然后配置缓存过期时间,并设置Cache提供器. 有4种内置的Hibernate数据并发冲突策略,代表数据库隔离 ...

  10. 构建自己的Java并发模型框架

    Java的多线程特性为构建高性能的应用提供了极大的方便,可是也带来了不少的麻烦.线程间同步.数据一致性等烦琐的问题须要细心的考虑,一不小心就会出现一些微妙的,难以调试的错误. 另外.应用逻辑和线程逻辑 ...