对于不了解网络编程的开发人员来说,编写一个良好的服务端通讯程序是一件比较麻烦的事情.然而通过EC这个免费组件你可以非常简单地构建一个基于linux或win部署运行的网络服务程序.这种便利性完全得益于mono这些年来的不停发展.下面介绍通过EC这个组件如何通过短短十来分钟的时候内就能实现一个聊天室通讯服务程序.

在实现一个网络通讯程序的时候需要定义一个通讯协议,但EC已经集成了基础的协议功能,只需要根据交互的数据定义消息类型即可(EC提供两种序列化对象描述分别是protobuf和msgpack).

消息定义

针对简单的聊到室只需要定义登进,登出和发言这几个消息如下:

    [MessageID(0x0001)]
[ProtoContract]
public class Login
{
[ProtoMember(1)]
public string Name { get; set; }
[ProtoMember(2)]
public string From { get; set; }
}
[MessageID(0x0003)]
[ProtoContract]
public class Signout
{
[ProtoMember(1)]
public string Name { get; set; }
[ProtoMember(2)]
public string From { get; set; }
}
[MessageID(0x0002)]
[ProtoContract]
public class Say
{
[ProtoMember(1)]
public string Content { get; set; }
[ProtoMember(3)]
public string From { get; set; }
[ProtoMember(2)]
public string Name { get; set; }
}

服务端

消息定义完成那用EC来制定一个聊天转发的服务端来说则是件非常简单的事情,只需要十来行代码就可以构建聊天和服务启动等相关功能.

    [EC.Controller]
public class Program
{
static void Main(string[] args)
{
EC.ECServer.Open();
System.Threading.Thread.Sleep(-1);
}
public void OnLogin(EC.ISession session, Chat.Login e)
{
session.Channel.Name = e.Name;
e.From = session.Channel.EndPoint.ToString();
foreach (Beetle.Express.IChannel other in session.Application.Server.GetOnlines())
{
if (other != session.Channel)
session.Application.Server.Send(e, other);
}
}
public void OnSay(EC.ISession session, Chat.Say e)
{
e.Name = session.Channel.Name;
e.From = session.Channel.EndPoint.ToString();
foreach (Beetle.Express.IChannel other in session.Application.Server.GetOnlines())
{
if (other != session.Channel)
session.Application.Server.Send(e, other);
}
}
}

以上一个简单的聊取室的登进和聊天的功能,不过还有一个需要我们去处理的就是当用户断开后如果反映给其他用户.在EC中监控连接断开的过程需要通过一个AppModel来监控,发布有连接断开了则向其他连接发送登出信息,代码如下:

    public class AppModel : EC.IAppModel
{
public void Init(EC.IApplication application)
{
application.Disconnected += (o, e) =>
{
Beetle.Express.IChannel channel = e.Session.Channel;
Chat.Signout msg = new Signout();
msg.Name = channel.Name;
msg.From = channel.EndPoint.ToString();
foreach (Beetle.Express.IChannel other in application.Server.GetOnlines())
{
if (other != channel)
application.Server.Send(msg, other);
}
};
} public string Name
{
get { return "AppModel"; }
} public string Command(string cmd)
{
throw new NotImplementedException();
}
}

EC提供一个IAppModel的自定义功能,通过AppModel可以监控用户会话,和处理全局消息的能力;在以后的文章再详细介绍.

客户端

EC同样提供便利的Client功能对象,你只需要定义简单的代码就可以向对应的服务端发送和接收相应的消息来处理.

EC.ProtoClient mClient = new EC.ProtoClient("127.0.0.1");
mClient.Receive = (o, p) => {
if (p.Message is Say)
{
Invoke(new Action<Say>(OnSay), p.Message);
}
else if (p.Message is Login)
{
Invoke(new Action<Login>(OnLogin), p.Message);
}
else if (p.Message is Signout)
{
Invoke(new Action<Signout>(OnSignout), p.Message);
}
};
mClient.Send(new Say{ Content=t"你好"});

借助于Xamarin我们还可以同样的方式把功能移植到不同平台下运行如android,ios等

		private IServiceChannel mClient = new ServiceChannel("10.0.2.2",10034);
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle); ServiceChannel.Register (typeof(MainActivity).Assembly);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
EditText name = FindViewById<EditText> (Resource.Id.txtname);
EditText say = FindViewById<EditText> (Resource.Id.txtsay);
TextView content = FindViewById<TextView> (Resource.Id.txtContent);
mClient.Receive = (o, p) => {
content.Post(delegate {
content.Append(p.Message.ToString());
});
}; FindViewById<Button> (Resource.Id.btnlogin).Click += delegate {
Login login = new Login();
login.Name = name.Text;
mClient.Send(login);
};
FindViewById<Button> (Resource.Id.btnsay).Click += delegate {
Say s = new Say{ Content=say.Text};
mClient.Send(s); };
// Get our button from the layout resource,
// and attach an event to it
}

这样一个多平台的基础聊天功能就完成了

    

    示例代码

轻易实现基于linux或win运行的聊天服务端程序的更多相关文章

  1. node.js服务端程序在Linux上持久运行

    如果要想在服务端部署node.js程序,让其持久化运行,就不能单单使用npm start命令运行,当然了,这样运行是毫无问题的,但是当关闭xshell窗口或者是关闭进程的时候(其实关闭xshell窗口 ...

  2. 【技术分享】linux各种一句话反弹shell总结——攻击者指定服务端,受害者主机(无公网IP)主动连接攻击者的服务端程序(CC server),开启一个shell交互,就叫反弹shell。

    反弹shell背景: 想要搞清楚这个问题,首先要搞清楚什么是反弹,为什么要反弹.假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规 ...

  3. java基于socket的网络通信,实现一个服务端多个客户端的群聊,传输文件功能,界面使用Swing

    最近在复习java的io流及网络编程.但复习写那些样板程序总是乏味的.便准备写个项目来巩固.想来想去还是聊天项目比较好玩.如果日后完成的比较好自己也可以用(哈哈哈).并且自己后面也要继续巩固java多 ...

  4. Android应用源码基于安卓的校园二手交易系统客户端+服务端+数据库

    该源码是校园二手交易系统应用带服务端,也是一个基于安卓和javaweb的校园二手交易系统,包括整套安卓客户端.javaweb服务端.mysql数据库,可以进行基本的列表显示帖子.显示帖子详情.用户注册 ...

  5. 基于fiddler的APP抓包及服务端模拟

    在HTTP接口的测试过程中,一般我们会按照如下的步骤进行: 1)测试环境的准备 2)HTTP消息体的构造 3)HTTP消息的发送及断言 如果我们可以拿到项目组的接口文档,并且HTTP后台服务是可以工作 ...

  6. 使用rsync在linux(客户端)拉取windows(服务端)数据

    windows 服务端ip:172.18.18.70 Linux客服端ip: 172.18.54.11 1.windows服务端下载cwRsync Server , 地址:https://www.ba ...

  7. [转]基于fiddler的APP抓包及服务端模拟

    在HTTP接口的测试过程中,一般我们会按照如下的步骤进行: 1)测试环境的准备 2)HTTP消息体的构造 3)HTTP消息的发送及断言 如果我们可以拿到项目组的接口文档,并且HTTP后台服务是可以工作 ...

  8. 基于vue的nuxt框架cnode社区服务端渲染

    nuxt-cnode 基于vue的nuxt框架仿的cnode社区服务端渲染,主要是为了seo优化以及首屏加载速度 线上地址 http://nuxt-cnode.foreversnsd.cngithub ...

  9. Linux centosVMware NFS介绍、NFS服务端安装配置、NFS配置选项

    一.NFS介绍 NFS是Network File System的缩写 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导开发,最新为4.1版 ...

随机推荐

  1. Android开发--环境的配置

    一 Android开发环境:JDK.eclipse ADT.海马模拟器或者夜神模拟器.配置之前先保证运行内存足够大,不然会导致运行卡. 二 JDK(不用安装) 1.jdk官方下载地址:http://w ...

  2. TCheckListBox

    TCheckListBox.CheckListBox http://www.cnblogs.com/mingdep/archive/2012/03/20/2408282.html 全部打勾 for ( ...

  3. C++中的左值与右值(二)

    以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的. 1. 2. 怎么区分左值和右值:知乎大神@顾露的回答. 3. 我们不能直接 ...

  4. 解决多网卡SNMP获取不到数据的问题

    前言 前几天,公司的某个平台突然访问不了,我以为是网站挂了,于是想连接服务器查看,谁知道连服务器都连不上,然后我尝试PING,结果一直PING不通,此时我有点慌了,但我的头脑还是保持清醒的,我马上连接 ...

  5. 在IIS6上部署MVC站点,Nhiernate数据库底层

    服务器环境要求: Windows 2003 server + IIS6.0 1.必须安装.net framework 4.0, MVC 2.最好能安装.net framework 的sp1, 我们服务 ...

  6. 【227】◀▶ IDL 其他常用函数

    参考:Programming and Control Routines —— 编程和控制函数 01   N_ELEMENTS 表达式或者变量的元素个数. 02   DEFSYSV 定义系统变量. 03 ...

  7. 共用字体-UI界面编辑器(SkinStudio)教程

    添加一个Label控件,设置好字体属性 再添加一个Label控件,字体属性还是默认的 只需要将字体属性的Name字段名称改为需要使用的字体属性的Name字段名称即可(如Label1使用的字体)

  8. phpPgAdmin安装与配置

    1.phpPgAdmin不需要安装,直接从Sourceforge下载压缩包,解压到“/var/www/”文件夹下即可. 解压后,要为该文件夹赋予root用户和root组的权限 chown -R roo ...

  9. ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆AnalyzerTool分词工具.非常实用!

    AnalyzerTool分词工具.非常实用! 可以查看某串字符最终被分割成什么样子,这样便于查询时深刻明白为什么有的查不到有的却能查到. package com.isoftstone.www.tool ...

  10. 第2章 C#中的泛型

    2.1 理解泛型2.1.1 为什么要有泛型 并不一定要使用字符T作为类型参数的名称,也可以使用其他的字符,但习惯上使用T. 2.1.2 类型参数约束什么是“向下的强制转换(downcast)”?因为O ...