对于不了解网络编程的开发人员来说,编写一个良好的服务端通讯程序是一件比较麻烦的事情.然而通过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(OnSay), p.Message);

}

else if (p.Message is Login)

{

Invoke(new Action(OnLogin), p.Message);

}

else if (p.Message is Signout)

{

Invoke(new Action(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 (Resource.Id.txtname);

EditText say = FindViewById (Resource.Id.txtsay);

TextView content = FindViewById (Resource.Id.txtContent);

mClient.Receive = (o, p) => {

content.Post(delegate {

content.Append(p.Message.ToString());

});

};

FindViewById (Resource.Id.btnlogin).Click += delegate {

Login login = new Login();

login.Name = name.Text;

mClient.Send(login);

};

FindViewById (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写聊天程序,轻易实现基于linux或win运行的聊天服务端程序相关推荐

  1. winform服务器消息推送,winform项目——仿QQ即时通讯程序12:服务端程序补充及优化...

    原标题:winform项目--仿QQ即时通讯程序12:服务端程序补充及优化 上一篇文章大概完成了服务端程序,今天继续做项目的时候发现还有一些功能没有做,还有几处地方不够完善.不做好就会影响客户端程序的 ...

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

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

  3. C++网络编程快速入门(二):Linux下使用select演示简单服务端程序

    目录 select参数解释 select使用规范 select使用缺点 基本流程 实例代码 通信效果演示 往期文章 select参数解释 extern int select (int __nfds, ...

  4. 基于半同步/半反应堆线程池实现的HTTP解析服务端程序

    简介: 半同步/半反应堆线程池是通过一个线程往工作队列添加任务T,然后工作线程竞争工作队列获得任务T.HTTP请求解析服务端程序:逐行解析客户端发送来的HTTP请求然后作出HTTP回答.采用线程池就是 ...

  5. 基于C#的AE+IDL二次桌面端程序开发

    目录 一.内容 1.2 实训内容      1.2.1 IDL综合开发      1.2.2 基于AO/AE的GIS二次开发    1.2.3 COM_IDL_connect组件开发 三. 实训软硬件 ...

  6. 封装利用libwebsockets写出的客户端、服务端程序为客户端服务端类

    封装利用libwebsockets写出的客户端.服务端程序为客户端服务端类 文章目录 封装利用libwebsockets写出的客户端.服务端程序为客户端服务端类 1.封装 2.封装后写wss客户端.服 ...

  7. 实现聊天室的功能 :C/C++ socket通信,一个服务端,多个客户端,客户端之间可以群聊

    这是我第一次尝试性的发篇博客,记述我用C/C++ 在Linux环境下socket网络通信,客户端和服务端通信使用包头,包体来解决粘包.以下是我的一些见解,和客户端和服务端的代码.希望可以帮助到同在学习 ...

  8. OSI七层模型以及TCP/UDP客户端/服务端程序实例

    OSI七层模型以及TCP/UDP客户端/服务端程序实例 一.前言 二.OSI简介 2.1 OSI概念 2.2 划分原则 2.3 OSI七层模型 2.4 模型举例 三.Linux下TCP/UDP程序开发 ...

  9. 《精通并发与Netty》学习笔记(02 - 服务端程序编写)

    上节我们介绍了开发netty项目所必需的开发环境及工具的使用,这节我们来写第一个netty项目 开发步骤 第一步:打开https://search.maven.org 找到netty依赖库 第二步:打 ...

最新文章

  1. rcp(插件开发) 如何查找自己定义的扩展点
  2. sqlserver中查找存储过程中的关键字方法之二
  3. 华为交换机ipv6默认路由配置_静态路由和默认路由的配置
  4. Sql Server中三种字符串合并方法的性能比较
  5. 洛谷 P1800 software_NOI导刊2010提高(06)(二分答案+DP检验)
  6. orgman set触发的pricing set创建逻辑
  7. 论文浅尝 | 区分概念和实例的知识图谱嵌入方法
  8. 信息奥赛一本通(1311:【例2.5】求逆序对)
  9. 牛客网编程练习之编程马拉松:发工资
  10. Atitit.列表页面and条件查询的实现最佳实践(2)------翻页 分页 控件的实现java .net php
  11. 中国指数基金与ETF价格战简史(1)
  12. Android 蓝牙AVRCP 专题 (2)----- 耳机端设置绝对音量,手机端收到音量改变Register Notification
  13. 成为阿里云架构师的进阶之路——阿里云首批ACE认证通过者逸疏专访
  14. Python实践3-Tenacity提高自动测试健壮性
  15. JQuery移动动画实现点击按钮切换图片--JQuery基础
  16. Web.config配置错误页
  17. 奋斗者——一个高级咨询师是怎样炼成的
  18. 短信格式(sms)以及编码总结
  19. 《爬楼梯》算法日记 2021.7.22,每天一道算法题,怒刷Leetcode,未做出,看评论思路后得出解。
  20. 20135108李泽源 Java实验一

热门文章

  1. 每日两SQL(2),欢迎交流~
  2. 那么到底什么是热点???
  3. hive提交命令org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Error parsing application ID:
  4. leetcode 382. Linked List Random Node | 382. 链表随机节点(Java)
  5. 左神算法:二叉树的最大 / 最小深度(普通+Morris遍历进阶)(Java版)
  6. 【Python】SQLAlchemy:session何时commit,何时close?
  7. 【Java多线程】高级主题:定时调度、quartz、指令重排、volatile、ThreadLocal
  8. JVM系列之:从汇编角度分析Volatile
  9. Libra教程之:运行自定义move modules
  10. Linux 串口 gprs at,linux下GPRS模块使用AT命令实现拨接电话,发中英文短信