ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前demo的基础上添加使用ESFramework.SL开发的Silverlight客户端。这样一来,不仅Silverlight客户端之间可以相互通信,Silverlight客户端还可以跟winform客户端进行通信。如果不了解在Silverlight中如何使用ESFramework,可以先看看ESFramework 4.0 快速上手 -- 在Silverlight中使用ESFramework

Silverlight客户端同样实现了以下功能并有所增强:

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

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

(3)所有在线用户(包括Winform客户端)之间可以进行文字聊天。

(4)消息同步调用。(演示了三种类型的同步调用)

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

一.服务端

服务端直接使用ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码的实现,并且增加了服务器同步调用客户端的功能 -- 即服务端向某个在线客户端提交请求并返回客户端的回复信息。我们利用了服务端UI的“工具”菜单里面“自定义功能”,当点击这个菜单时,将默认向在线用户列表中的第一个用户发送同步调用请求。如图中第一个在线用户是aa01,那么点击“自定义功能”后,就由aa01来处理服务端的同步调用。

服务端同步调用客户端由ICustomizeInfoController.QueryClient()方法来实现。


        /// <summary>
        /// 询问在线客户端,并返回应答信息。如果目标用户不在线,或超时没有应答则将抛出Timeout异常。
        /// </summary>      
        /// <param name="userID">接收并处理服务器询问的目标用户ID</param>
        /// <param name="informationType">自定义请求信息的类型</param>
        /// <param name="info">请求信息</param>
        /// <returns>客户端给出的应答信息</returns>
        byte[] QueryClient(string userID, int informationType, byte[] info);

二.客户端

1.客户端的MainPage类实现了ESFramework.SL.Application.Basic.IBasicBusinessHandler接口,以接收其他用户的上下线通知、被挤掉线通知、心跳超时通知等。

2.客户端的MainPage类还实现了ESFramework.SL.Application.CustomizeInfo.ICustomizeInfoBusinessHandler接口,以处理来自其它用户的聊天消息、来自服务端的同步调用、以及来自其它客户端的P2P同步调用等。

3.客户端的MainPage类还预定并处理了ESFramework.SL.Rapid.IRapidPassiveEngine的TcpPassiveEngine属性的与连接状态变化相关的事件,如连接断开、重连开始、重连成功/失败。

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


  当有其他用户登陆时,会在“在线用户列表”中显示出来,点击选择用户ID,就可以与该用户聊天。UI右边上面是与所选择的用户的聊天历史记录,下面是发送消息的文本框。 从在线用户列表选择要对话的好友,然后在聊天输入框输入文本,最后点击“发送”按钮即可。程序通过ESFramework.SL.Application.CustomizeInfo.ICustomizeInfoOutter的Send方法发送消息给好友。

   void Send(string targetUserID, int informationType, byte[] info);

好友掉线时,好友的名称会从好友列表中消失,如果正在与该好友聊天,则右边的历史记录会清空,“发送”按钮也不再可用。

  如果我们在另一个地方再登陆一个aa01(演示重登陆),程序会先回调ESFramework.SL.Application.Basic.IBasicBusinessHandler的OnBeingPushedOut(),然后再触发TcpPassiveEngine的ConnectionInterrupted事件,通知当前的用户。

 三、同步调用

这个demo里面演示了三种类型的同步调用:客户端与客户端之间的同步调用,客户端同步调用服务端,服务端同步调用客户端。

1.客户端同步调用服务端:这个在前一个Demo中演示过,在Sliverlight客户端中完全使用一样的模式。

2. 服务端同步调用客户端:这个在第一部分已经介绍,而客户端是通过实现ICustomizeInfoBusinessHandler接口的HandleQueryFromServer方法来处理来自服务端的同步调用的:


        /// <summary>
        /// 处理来自服务端的询问信息,并给出应答信息。(即处理服务端ICustomizeInfoController.QueryClient发出的请求)
        /// </summary>    
        /// <param name="informationType">自定义信息类型</param>
        /// <param name="info">二进制信息</param>
        /// <returns>应答信息</returns>
        byte[] HandleQueryFromServer(int informationType, byte[] info);    

3. 客户端同步调用客户端:调用是由ICustomizeInfoOutter接口的CommitP2PRequest方法来发出的,


        /// <summary>
        /// 向在线目标用户提交请求信息,并返回应答信息。如果目标用户不在线,或超时没有应答则将抛出Timeout异常。
        /// </summary>      
        /// <param name="targetUserID">接收并处理请求消息的目标用户ID</param>
        /// <param name="requestInfoType">自定义请求信息的类型</param>
        /// <param name="requestInfo">请求信息</param>
        /// <returns>应答信息</returns>
        byte[] CommitP2PRequest(string targetUserID, int requestInfoType, byte[] requestInfo);

目标客户端收到来自其他用户的同步调用请求后,会由ICustomizeInfoBusinessHandler接口的HandleP2PRequest方法来处理这个请求:

        byte[] HandleP2PRequest(string sourceUserID, int requestInfoType, byte[] requestInfo);

四. 两种类型的客户端公用同一服务端

      基于ESFramework Rapid引擎开发的winform客户端和silverlight客户端可以公用同一个服务端,甚至以后,ESFramework还可能支持基于C++/Flash/Java的客户端。下图是本文的Demo启动后,silverlight客户端和winform客户端用户之前的通信截图。

五.Demo源码下载

下载本文的Demo源码。注意,在运行基于Silverlight的客户端程序时,服务器上首先应该起到“Silverlight策略服务器”,可以从ESFramework 4.0 概述文末下载策略服务器。

聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)的更多相关文章

  1. 聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)

    本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能.如果不了解如何使用ESFramework提供的文件传送功 ...

  2. 一个简单的IM系统(Demo附源码)-- ESFramework 4.0 快速上手(08)

    前面的文章已经介绍完了基于ESFramework/ESPlus进行二次开发的所有要点,现在,我们可以开始小试牛刀了. 本文将介绍使用ESFramework的Rapid引擎开发的两个最简单的Demo,E ...

  3. 客户端登录验证 -- ESFramework 4.0 快速上手(15)

    在之前版本的Rapid引擎中,是没有提供客户端登陆验证的机制的,如果要验证用户的帐号密码信息,我们只有自己手动通过自定义信息来实现.在2011.04.25发布的新版本中,客户端Rapid引擎,则内置了 ...

  4. 轻量级通信引擎StriveEngine —— C/S通信demo(2) —— 使用二进制协议 (附源码)

    在网络上,交互的双方基于TCP或UDP进行通信,通信协议的格式通常分为两类:文本消息.二进制消息. 文本协议相对简单,通常使用一个特殊的标记符作为一个消息的结束. 二进制协议,通常是由消息头(Head ...

  5. C#轻量级通通讯组件StriveEngine —— C/S通信开源demo(2) —— 使用二进制协议 (附源码)

    前段时间,有几个研究ESFramework通信框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好友关 ...

  6. (原创)通用查询实现方案(可用于DDD)[附源码] -- 简介

    [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3985353.html).   [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ...

  7. ASP.NET程序读取二代身份证(附源码)

    原文:ASP.NET程序读取二代身份证(附源码) 一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了. 这里我说说我的解决思路: 一.你必要有联机型居民身份证阅读器一 ...

  8. zookeeper使用详解(命令、客户端、源码)

    1. zookeeper使用详解(命令.客户端.源码) 1.1. 前言   zookeeper我们常用来做分布式协调中间件,很多时候我们都接触不到它的原理和用法,我对他的了解也仅限于知道它可以做分布式 ...

  9. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

随机推荐

  1. HDU 1269 迷宫城堡(DFS)

    迷宫城堡 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的 ...

  2. 解决后端动态生成css时无法调用

    在PHP 设置头 header("Content-type: text/css");

  3. wpf 线程与界面线程

    Thread thread = new Thread(new ThreadStart(() =>        {            VisualTarget visualTarget =  ...

  4. wpf 界面线程 添加项

    foreach (var r in sec.Records) { listView.Dispatcher.Invoke((new Action(delegate() { listView.Items. ...

  5. 给RelativeLayout设置背景,无效果bug解决

    drawable文件夹下面 tomyshop_selector.xml文件 <?xml version="1.0" encoding="utf-8"?&g ...

  6. Unity3D脚本使用:Time

    1.Time 使用方式 使用效果 2.yield 延迟执行    嵌套延迟   

  7. 两种画线算法(DDA&Bersenham)

    DDA(digital differential analyzer) 由直线的斜截式方程引入 对于正斜率的线段,如果斜率<=1,则以单位x间隔(δx=1)取样,并逐个计算每一个y值 Yk+1 = ...

  8. Chapter 2 Open Book——33

    My chin raised a fraction. 我的下巴抬起来了一点. 我略微抬起下颚. "No, she did not send me here. I sent myself.&q ...

  9. Chapter 21_2 模式匹配函数

    基础函数比较简单,就是几个普通的函数string.byte.string.char.string.rep.string.sub.string.format还有大小写转换函数upper和lower. 接 ...

  10. WPF 限制Textbox输入的内容

    限制文本框TextBox的输入内容,在很多场景都有应用.举个例子,现在文本框中,只能输入0.1.2.3.4.5.6.7.8.9.“|”这11个字符. 限制输入0-9很容易实现,关键是这个“|”符号.它 ...