聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)
在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)的更多相关文章
- 聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)
		本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能.如果不了解如何使用ESFramework提供的文件传送功 ... 
- 一个简单的IM系统(Demo附源码)-- ESFramework 4.0 快速上手(08)
		前面的文章已经介绍完了基于ESFramework/ESPlus进行二次开发的所有要点,现在,我们可以开始小试牛刀了. 本文将介绍使用ESFramework的Rapid引擎开发的两个最简单的Demo,E ... 
- 客户端登录验证 -- ESFramework 4.0 快速上手(15)
		在之前版本的Rapid引擎中,是没有提供客户端登陆验证的机制的,如果要验证用户的帐号密码信息,我们只有自己手动通过自定义信息来实现.在2011.04.25发布的新版本中,客户端Rapid引擎,则内置了 ... 
- 轻量级通信引擎StriveEngine —— C/S通信demo(2) —— 使用二进制协议 (附源码)
		在网络上,交互的双方基于TCP或UDP进行通信,通信协议的格式通常分为两类:文本消息.二进制消息. 文本协议相对简单,通常使用一个特殊的标记符作为一个消息的结束. 二进制协议,通常是由消息头(Head ... 
- C#轻量级通通讯组件StriveEngine —— C/S通信开源demo(2) —— 使用二进制协议 (附源码)
		前段时间,有几个研究ESFramework通信框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好友关 ... 
- (原创)通用查询实现方案(可用于DDD)[附源码] -- 简介
		[声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3985353.html). [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ... 
- ASP.NET程序读取二代身份证(附源码)
		原文:ASP.NET程序读取二代身份证(附源码) 一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了. 这里我说说我的解决思路: 一.你必要有联机型居民身份证阅读器一 ... 
- zookeeper使用详解(命令、客户端、源码)
		1. zookeeper使用详解(命令.客户端.源码) 1.1. 前言 zookeeper我们常用来做分布式协调中间件,很多时候我们都接触不到它的原理和用法,我对他的了解也仅限于知道它可以做分布式 ... 
- 【转】.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 ... 
随机推荐
- 简单工厂设计模式(Simple Factory Design Pattern)
			[引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见 ... 
- PHP在浏览器上跟踪调试的方法以及使用ChromePhp、FirePHP的简单介绍
			之前用ThinkPHP时发现有个 trace 函数可以跟踪调试,感觉很有意思,网上搜索了下类似的东西,发现了 ChromePhp ,以前没想过这样来调试 PHP 程序,感觉非常方便,很有用. Thin ... 
- jquery.ajax异步发送请求的简单测试
			使用ajax异步发送请求到一般处理程序,判断输入的用户名和密码 1.添加Html页面,导入jquery 2.编写js代码和页面标签 <script type="text/javascr ... 
- 一步步优化JVM一:概述、方法及需求
			现代JVM是一个具有灵活适应各种应用能力的软件,尽管很多应用能够在JVM的默认配置下运行良好,但是有些应用还是需要优化JVM配置以达到其性能要求.由于各种各样的应用能够运行在现在JVM上面,所以大量的 ... 
- 制作jar包
			1.打开cmd 2.通过cd切换到要打包的工程所在的bin目录(一定是bin目录) 运行jar -cvf aa.jar *.* jar是打包的命令 -cvf可以自行查看一下文档解释(jar -help ... 
- 提取出图像中感兴趣的部分,cvSetImageRoi,Rect
			在做人脸检测的时候,需要从摄像头拍摄视频中把检测到的人脸区域提取出来,网上找了很多博客,发现多数都是在用cvSetImageRoi函数,该函数声明如下:void cvSetImageROI(IplIm ... 
- java导出数据Excel总结
			//创建获取到JFileChooser的文件名的JTextField public JTextField getTextField(Container c){ JTextField textField ... 
- php根据IP获取经纬度信息--百度地图篇
			一.前言 之前一篇写过 php根据IP获取IP所在城市 ,但是还想再精确一点,获取这个IP所在的经纬度信息,该怎么办呢? 百度地图为我提供了一种解决方案(当然还有其他的解决方案). 先总的来数一下, ... 
- xcode6+ios8 横屏下启动画面不显示问题修改
			本文转载自汉果博客 » xcode6+ios8 横屏下启动画面不显示问题修改 最近我做游戏 发现xcode6+ios8 横屏下启动画面不显示 显示黑屏 . 设置横屏后 设置catalog 添加使用 ... 
- JavaScript  执行环境(执行上下文) 变量对象 作用域链 上下文 块级作用域 私有变量和特权方法
			总结自<高程三>第四章 理解Javascript_12_执行模型浅析 JS的执行环境与作用域 javascript高级程序第三版学习笔记[执行环境.作用域] 在javascript ... 
