ESFramework Demo -- 入门Demo,简单的即时通讯系统(包含 .NET/Android/iOS/WebSocket/Xamarin 源码)

     (本Demo提供了.NET/Xamarin/Android/iOS/WebSocket客户端版本,本文仅以.NET和Xamarin版本作为示例讲解

       前面的文章已经介绍完了基于ESFramework/ESPlus进行二次开发的所有要点,现在,我们可以开始小试牛刀了。

      本文将介绍使用ESFramework开发的一个入门Demo,该Demo演示了以下功能:

(1)客户端用户上下线时,通知其他在线用户

(2)当客户端与服务端网络断开时,进行自动重连,当网络恢复后,重连成功

(3)所有在线用户之间可以进行文字聊天

(4)文件传送

(5)P2P通道

(6)消息同步调用

(7)重登陆模式。当同名的用户登陆时,会把前面的用户挤掉。

一.基础步骤

      按照ESFramework 开发手册(06) -- Rapid通信引擎一文中提到的二次开发步骤,我们按照顺序来一步步来实现这个demo。(请从文末下载demo源码,然后对照着看,将更容易理解)     

1.确定是否需要Contacts功能

(1)确定是否需要联系人关系。在本demo中,我们假定所有的在线用户相互之间都是联系人。

2)确定是否需要分组。在本demo中,我们不需要广播消息,不需要进行分组。

      结合(1)和(2),这样就可以直接使用ESPlus提供的DefaultContactsManager

2.定义信息类型

    在本demo中,我们定义3个信息类型,一个类型表示文字聊天消息,一个类型表示振动提醒,第三个表示客户端同步调用服务端。其定义如下:

    public static class InformationTypes
    {
        /// <summary>
        /// 聊天信息
        /// </summary>
        public const int Chat = 0;

        /// <summary>
        /// 振动提醒
        /// </summary>
        public const int Viberation = 1;

        /// <summary>
        /// 客户端同步调用服务端
        /// </summary>
        public const int ClientCallServer = 100;
    }

      由于InformationTypes的定义以及接下来定义的信息协议类在客户端和服务端都需要用到,所以,我们将其放在一个单独的项目ESFramework.EntranceDemo.Core中,客户端和服务端都可以引用它。

3.定义协议类

      信息类型定义好后,我们接下来定义信息协议。

      对于聊天消息(InformationTypes.Chat),由于消息中除了聊天内容外,还包含了该消息的产生时间,所以我们专门定义了一个协议类:TextChatContract。

      对于振动提醒(InformationTypes.Viberation),由于不需要传送额外的内容,所以不需要对应的协议类。

      对于同步调用(InformationTypes.ClientCallServer),我们的demo假设请求信息是一个字符串,回复信息也是字符串,直接使用UTF-8编码就可以了,不需要专门的协议类。或者说,string就是我们用到的协议类。

4.实现自定义信息处理器

      客户端的MainForm实现了ICustomizeHandler接口,其主要实现HandleInformation方法,来处理收到的聊天信息和振动提醒。

  void HandleInformation(string sourceUserID, int informationType, byte[] info);

      服务端的CustomizeHandler实现了服务端的ICustomizeHandler接口,其主要实现HandleQuery方法来处理来自客户端的同步调用(InformationTypes.ClientCallServer)。

  byte[] HandleQuery(string sourceUserID, int informationType, byte[] info);

5.服务端验证用户登录的帐号

       服务端的BasicHandler类实现IBasicHandler接口,以验证登录用户的账号密码。

       本demo中,假设所有的验证都通过,所以验证方法直接返回true。

6.客户端基础逻辑

(1)处理状态变化事件

      客户端在MainForm的Initialize方法中,预定了Rapid客户端引擎暴露的连接状态变化事件,如连接断开、重连开始、重连成功并重新登录完成。

      另外,客户端还预定了IBasicOutter和IContactsOutter的相关状态改变事件,以处理联系人的上下线通知、自己被挤掉线通知、自己被踢出通知等。

(2)创建P2P通道

      每次双击好友头像,弹出聊天窗口时,就尝试与对方建立P2P通道:

   //尝试与目标用户建立P2P通道,尝试的结果将由P2PController的P2PChannelOpened或P2PConnectFailed事件来通知。
   this.rapidPassiveEngine.P2PController.P2PConnectAsyn(info.Item.Text);

(3)传送文件

      在聊天窗口上,点击传送文件的按钮,便可选择文件进行发送。 

7.初始化Rapid引擎

      在服务端和客户端各自的Program类的Main方法中,初始化Rapid引擎。 

     上面我们介绍了这个demo需要的主要元件,我们接下来看看客户端和服务端所需的额外基础设施。

二.服务端说明

     如果获取了ESFramework的正式授权,那么应该在初始化服务端引擎之前,设定正确的授权用户帐号和密码。 demo中使用的是免费帐户“FreeUser”。  

    ESPlus.GlobalUtil.SetAuthorizedUser(AuthorizationVerifier.FreeUser, "");

       服务端直接使用了ESFramework.Boost 提供的默认的主窗体MainServerForm,来显示在线用户状态信息。

    //如果不需要默认的UI显示,可以替换下面这句为自己的Form
   MainServerForm mainForm = new MainServerForm(RapidServerEngine);

      服务端运行起来后,界面如下所示:     

     

(1)最下面的状态栏,显示了线程池中剩余的线程数,初始设定的后台线程池和IOCP线程都是100个。最右边的“在线人数”还显示了已成功建立的连接数-用户数。

(2)当有用户登陆时,在线用户列表中会实时显示每个用户的状态。     

三.客户端说明

1. PC版客户端

     客户端启动登陆后,显示的主界面MainForm如下:    

    

    当有其他用户登陆时,会在“在线用户列表”中显示出来,双击头像,会弹出聊天窗口,就可以对话了。   

    

    当该窗口会灰掉不可用时,表示好友已经掉线。

    如果与对方的P2P通道创建成功,则会在窗体的Title显示类似“TCP直连:*****”的信息: 

    

    下图是演示传送文件功能的截图: 

    

   如果我们再登陆一个aa01(演示重登陆),则原来aa01的主界面状态栏会显示如下:    

    

      如果Client与服务器不在一台机器上,你还可以通过断开网络在恢复网络以观察自动重连的效果,主界面的状态栏也有相应的文字提示。或者更简单地,直接退出服务端,这会断开所有的客户端连接,也类似于断线的效果;再重启服务端,客户端就会重连上来了。

      最后,点击“测试请求123”后面的按钮,可以测试消息同步调用,消息同步调用是通过客户端的ICustomizeOutter接口的Query方法来发出的,同步调用请求将被前述的服务端的HandleQuery方法处理的。

2.Xamarin 客户端

       

 

    

      要提醒的是,本示例仅仅是一个demo,是为了展示如何使用ESFramework提供的功能而存在,为了简洁,省略了很多工作,比如,将Rapid引擎实例作为Program的静态成员,又如上面的MainForm实现了多个接口,使得MainForm类变得比较巨大。大家在正式的项目中,应该根据项目实际情况做正确的结构设计,不要效仿本例。 

四.源码下载

(1)ESFramework.EntranceDemo 源码  (内含入门Demo的服务端 以及 .NET/Android/iOS/WebSocket客户端版本)

(2)ESFramework.XamarinDemo 源码内含入门Demo的 Xamarin Android 和 Xamarin iOS 客户端版本)   另: ESFramework.Xamarin 开发手册

(3)ESFramework.Boosts 源码:ESFramework 增强库,里面有本文用到的MainServerForm窗体的源码

 

如果要同时支持SSL加密的WebSocket客户端(即支持wss),可以参考:ESFramework 使用技巧 -- 支持 SSL 加密的 WebSocket  (wss)

----------------------------------------------------------------------------------------------------------------------------------------------- 

 下载免费版本的ESFramework 以及 demo源码  

Q Q:168757008

官网:www.oraycn.com

导航

首页

官方网站

立即咨询 

站内搜索

ESFramework 通信框架

详细说明

SDK下载

ESFramework FAQ

版本变更记录

OMCS 语音视频框架

详细说明

SDK下载

OMCS FAQ

版本变更记录

OrayTalk 企业即时通讯系统

详细说明

客户端下载

傲瑞实用组件

SDK下载

NPush 消息推送组件

StriveEngine 轻量级的通信引擎

MFile 语音视频录制组件

MCapture 语音视频采集组件

MPlayer 语音视频播放组件

OAUS 自动升级系统

傲瑞组件 FAQ

授权

授权流程

产品授权说明

产品选购指南

授权SDK使用说明

其它

SDK使用技巧

联系我们

电话:027-87638960

Q Q:168757008

邮件:master@oraycn.com