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()方法来实现。

  1.  
  2.         /// <summary>
  3.         /// 询问在线客户端,并返回应答信息。如果目标用户不在线,或超时没有应答则将抛出Timeout异常。
  4.         /// </summary>      
  5.         /// <param name="userID">接收并处理服务器询问的目标用户ID</param>
  6.         /// <param name="informationType">自定义请求信息的类型</param>
  7.         /// <param name="info">请求信息</param>
  8.         /// <returns>客户端给出的应答信息</returns>
  9.         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方法发送消息给好友。

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

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

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

 三、同步调用

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

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

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

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

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

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

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

  1.         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. wuzhicms 数据迁移策略

    1,本地的域名或ip为特殊域名或ip,勿用 127.0.0.1   或 localhost 或192.168.1.101  等 2,导出数据库,替换所有域名为新域名 3,替换所有文件域名为新域名 4, ...

  2. Canvas_2

    绘制矩形: fillRect(x,y,width,height)===========>绘制一个有填充颜色的矩形strokeRect(x,y,width,height)========>绘 ...

  3. lda 主题模型--TOPIC MODEL--Gibbslda++结果分析

    在之前的博客中已经详细介绍了如何用Gibbs做LDA抽样.(http://www.cnblogs.com/nlp-yekai/p/3711384.html) 这里,我们讨论一下实验结果: 结果文件包括 ...

  4. js验证如何限制文本框只能输入数字

    s限制只能数字输入,并且在把输入的“非法字符”清除掉之后将焦点停留在输入非法字符的位置,参考如下:html部分:<input value="" type="text ...

  5. 浙大pat1013题解

    1013. Battle Over Cities (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It ...

  6. MYSQL的一些函数

    原文地址:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html 1,字符串类的函数 CHARSET(str) //返回字串字符集CONCAT (st ...

  7. ios 3D Touch功能的实现

    ios9中3D Touch功能是一个新的亮点,这个方便快捷的功能实现也比较简单,废话不多说直接上代码, 一.3D Touch功能添加分为两种(1).静态标签 (2).动态标签 (1).静态添加 这个方 ...

  8. php笔记(二)PHP类和对象之Static静态关键字

      PHP类和对象之Static静态关键字 静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用.静态属性不允许对象使用->操作符调用. class Car { pr ...

  9. Spring 配置文件XML -- <beans>中属性概述

    beans : xml文件的根节点. xmlns : XML NameSpace的缩写,因为XML文件的标签名称都是自定义的,自己写的和其他人定义的标签很有可能会重复命名,而功能却不一样,所以需要加上 ...

  10. php入门 数据类型 运算符 语言结构语句 函数 类与面向对象

    php PHP-enabled web pages are treated just like regular HTML pages and you can create and edit them ...