跨平台开源通讯组件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(-);
} 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()]
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(-);
} 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(-);
} 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 > )
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 > )
{
Order order = (Order)gdOrder.SelectedRows[].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, , ); }
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%,如果扔在那里感觉有点可惜了,所以把产品开源出来,如果有兴趣的朋友可以复制完善它。
跨平台开源通讯组件elastic communication的更多相关文章
- 开源通讯组件ec
跨平台开源通讯组件elastic communication elastic communication是基于c#开发支持.net和mono的通讯组件(简称EC),EC的主要目的简化mono和.net ...
- Net Core开源通讯组件 SmartRoute
Net Core开源通讯组件 SmartRoute(服务即集群) SmartRoute是基于Dotnet Core设计的可运行在linux和windows下的服务通讯组件,其设计理念是去中心化和零配置 ...
- .Net Core开源通讯组件 SmartRoute(服务即集群)
SmartRoute是基于Dotnet Core设计的可运行在linux和windows下的服务通讯组件,其设计理念是去中心化和零配置即可实现服务通讯集群.SmartRoute是通过消息订阅的机制实现 ...
- 【开源】C#跨平台物联网通讯框架ServerSuperIO(SSIO)
[连载]<C#通讯(串口和网络)框架的设计与实现>-1.通讯框架介绍 [连载]<C#通讯(串口和网络)框架的设计与实现>-2.框架的总体设计 目 录 C#跨平台物联 ...
- 开源跨平台IOT通讯框架ServerSuperIO,集成到NuGet程序包管理器,以及Demo使用说明
物联网涉及到各种设备.各种传感器.各种数据源.各种协议,并且很难统一,那么就要有一个结构性的框架解决这些问题.SSIO就是根据时代发展的阶段和现实实际情况的结合产物. 各种数据信息,如下图 ...
- 【重大更新】开源跨平台物联网通讯框架ServerSuperIO 2.0(SSIO)下载
更新具体细节参见:[更新设计]跨平台物联网通讯框架ServerSuperIO 2.0 ,功能.BUG.细节说明,以及升级思考过程! 声明:公司在建设工业大数据平台,SSIO正好能派上用场,所以抓紧时间 ...
- [重磅开源] 比SingleR更适合的websocket 即时通讯组件---ImCore开源了
有感而发 为什么说 SignalR 不合适做 IM? IM 的特点必定是长连接,轮训的功能用不上. 因为它是双工通讯的设计,用hub.invoke发送命令给服务端处理业务,其他就和 ajax 差不多, ...
- 突破自我,开源NetWorkSocket通讯组件
前言 在<化茧成蝶,开源NetWorkSocket通讯组件>发表之后,收到大家很多个star,在此感谢!更可贵的是,一些网友提出了许多好建议,经过一些时间的思考,决定将NetworkSoc ...
- 开源NetWorkSocket通讯组件
开源NetWorkSocket通讯组件 前言 在<化茧成蝶,开源NetWorkSocket通讯组件>发表之后,收到大家很多个star,在此感谢!更可贵的是,一些网友提出了许多好建议,经 ...
随机推荐
- 分享自制的13套 JQuery Mobile 界面主题(追加4套新款)
15套整合在一起的,其中2套官方+13套自制,款款精致,方便移动开发. 字体默认为微软雅黑. 适配于 JQuery Mobile 1.4.3 下载地址:http://files.cnblogs.com ...
- MJPhotoBrowser BUG修复
崩溃在loading.progress = (float)receivedSize/expectedSize; 分析:MJPhotoView 执行了hide移除了MJPhotoLoadingView, ...
- 【windows 下安装 mysql-server 无法登录问题解决】
----------------------------- 无感的首行 ----------------------------- 新版 mysql-server 5.7 安装后发现无法使用 mysq ...
- 关于KB905474正版验证补丁破解办法 KB905474是个微软操作系统正版/盗版监测间谍软件。更新安装后,右下角有个提示说“系统监测到你的操作系统是盗版”。 如果没有安装的: 在系统提示更新的时候注意看一下,如果包含有“更新KB905474”就去掉“更新KB905474”方框前的勾,点击关闭(注意如果没有去掉那个勾得话,会找不到“关闭”,而是“确定”),在不在提示我该消息前打勾。 如果已经安装
关于KB905474正版验证补丁破解办法 KB905474是个微软操作系统正版/盗版监测间谍软件.更新安装后,右下角有个提示说“系统监测到你的操作系统是盗版”. 如果没有安装的: 在系统提示更新的时候 ...
- 对 web.config 节点信息进行加密
记录一下,免得以后再网上找 项目中,数据库访问链接字符串配置在web.config中,明文的,应客户需求需改成密文,so,需要加密. 一开始想的是需要重写configuration什么什么的,最后发现 ...
- ncurses-devel
:Install ncurses(ncurses-devel) and try again. 做一个简单的铺垫,ncurses是字符终端下屏幕控制的基本库.可能很多新开发的程序已经不再使用.假如要编译 ...
- ubuntu linux mysql 安装 基本操作 命令
mysql --help #如果有信息证明系统已经安装了mysql mysql -V #查看版本号 netstat -tap|grep mysql #检查mysql是否在启动状态 卸载mysql: s ...
- text-align:justify的使用
在平常的开发过程中,对于text-align一般用到的是left,center,right,这三个属性都不会陌生.然而,对于justify的使用我却是很陌生.首先有个比较简单的例子. 首先是html代 ...
- sql server 分布式查询 和 主从服务器搭建
1. 8K 对应的SQL语句限制 select * from openquery (recei 连接服务器名称 执行的sql 语句放在 SELECT @@SERVERNAME 在本地 ...
- 三大基础排序算法BubbleSort、SelectSort、InsertSort
public class Strategy { public static void main(String[] args) { int [] array=new int[]{26,25,15,42, ...