聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)
本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能。如果不了解如何使用ESFramework提供的文件传送功能,可以先看看ESFramework 4.0 快速上手(13) -- 文件传送,如此简单一文的详细介绍。
本Demo可演示以下与文件传送相关的特性:
(1)发送方请求发送文件,接收方可以同意或拒绝接收文件。
(2)文件传送的过程中,收发的任何一方都可以通过事件了解文件传送的实时进度。
(3)文件传送的过程中,收发的任何一方都可以中断文件的传送。
(4)文件传送的过程中,收发的任何一方掉线,都将导致文件传送中断。
(5)只要文件传送中断,收发方都会得到相应的事件通知。
(6)自动启用文件断点续传。
(7)文件传送完成,收发方都会得到相应的事件通知。
一.服务端
服务端只需要用调用引擎RapidServerEngine的初始化方法的另外一个重载就可以启用框架的文件传送功能:
void Initialize(int port, ICustomizeInfoBusinessHandler customizeInfoBusinessHandler, IFileBusinessHandler fileBusinessHandler, IFriendsManager friendsManager, IGroupManager groupManager)
该重载方法多了一个IFileBusinessHandler(位于ESPlus.Application.FileTransfering.Server)参数,我们直接传入框架提供ESPlus.Application.FileTransfering.Server.FileBusinessHandler实例即可。由于在本demo中,服务端即不会是文件发送方、也不会是文件接收方,所以服务端的初始化方法的IFileBusinessHandler参数只要不传入null,就表示服务端会支持客户端之间的文件传送功能。
如果我们要做的是类似FTP的系统,那么这个参数就很重要了,IFileBusinessHandler的实现决定了服务端对客户端上传文件的相关策略。在类似FTP的系统中,我们只要将服务端看做是一个普通的文件收发方,就像一个收发文件的客户端一样,就可以公用同样的文件传送流程了。
二.客户端
本Demo演示的主要是客户端之间的文件传送,所以客户端的逻辑稍微复杂一点,我们分解说明如下。
1.初始化
客户端引擎RapidPassiveEngine的初始化也需要用另外一个重载方法:
void Initialize(string userID, string serverIP, int serverPort, IBasicBusinessHandler basicHandler, ICustomizeInfoBusinessHandler customizeHandler ,IFileBusinessHandler fileHandler);
该重载方法也是多了一个IFileBusinessHandler(位于ESPlus.Application.FileTransfering.Client)参数,IFileBusinessHandler接口有两个方法:ReadyToAcceptFile方法的实现通常是询问当前用户是否同意接收对方发送的文件;而OnResponseOfReceiver方法的实现通常是告诉发送方对方是否同意了接收文件。Demo中的MainForm类实现了IFileBusinessHandler接口。
2.发送文件
在聊天窗口,当用户点击了左上角的发送文件按钮,并选择了要发送的文件后,程序就会通过IFileOutter接口的BeginSendFile方法来开启文件传送流程。
void BeginSendFile(string accepterID, string filePath, string comment, SendingFileParas paras, out string fileID);
我们可以通过SendingFileParas参数来控制文件数据包的发送策略。
BeginSendFile方法调用后,接收方将会通过上述的ReadyToAcceptFile方法得到通知,如果同意接收,则发送方就会通过上述的OnResponseOfReceiver方法得到通知,且框架会自动在后台开启文件传送线程。
3.传输文件状态显示
当文件传送正式开始以后,我们就需要了解当前文件传输的状态。本Demo直接使用了ESPlus提供的ESPlus.FileTransceiver.Widgets.FileTransferingViewer控件。我们将这个控件从工具箱拖拽到聊天窗口右边的Panel上,然后将其传入IFileOutter的InitializeFileTransferingViewer方法进行初始化后,它就能正常工作了。本demo中,我们在ChatForm类的构造函数中初始化该控件。
在运行时,我们可以在该控件上显示的正在传送的文件的Item上点击“取消”按钮,以中断文件传输 -- 控件会自动将该动作传递给框架以自动取消,我们在代码中不需要再做任何取消传送的处理。
4.文件传送事件处理
我们在ChatForm类中预定了FileTransferingViewer的几个事件,来接收文件传送的相关事件通知,以在UI上显示告诉当前用户:文件传送开始、中断、完成、续传等。如果你的项目中不需要用到FileTransferingViewer,那么可以通过预定ESPlus.Application.FileTransfering.IFileController接口暴露的FileSendingEvents和FileReceivingEvents来跟踪每个文件传送项目的状态。
5. 关闭聊天窗口的时候,中断文件传输
当与对方有多个文件正在传送中,点击关闭聊天窗口,我们需要调用IFileOutter接口的CancelFileTransferingAbout方法来取消与当前聊天对象正在进行的所有文件传输。
void CancelFileTransferingAbout(string destUserID);
众多其它细节,已经在ESFramework 4.0 快速上手(13) -- 文件传送,如此简单一文中作了详细介绍,这里不再赘述。大家可以参考上文和本文,然后对照源码进行研究,很容易就可以理解内部的运转流程了。
三.Demo源码下载
Demo运行截图如下所示:

下载本文的Demo源码(VS2005)。
聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)的更多相关文章
- 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)
在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前d ...
- Winforn中DevExpress的TreeList中显示某路径下的所有目录和文件(附源码下载)
场景 Winform中DevExpress的TreeList的入门使用教程(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- 一个简单的IM系统(Demo附源码)-- ESFramework 4.0 快速上手(08)
前面的文章已经介绍完了基于ESFramework/ESPlus进行二次开发的所有要点,现在,我们可以开始小试牛刀了. 本文将介绍使用ESFramework的Rapid引擎开发的两个最简单的Demo,E ...
- Asp.net实现直接在浏览器预览Word、Excel、PDF、Txt文件(附源码)
功能说明 输入文件路径,在浏览器输出文件预览信息,经测试极速(Chrome).IE9.Firefox通过 分类文件及代码说明 DemoFiles 存放可测试文件 Default.aspx 启动页 ...
- Android 音视频深入 十五 FFmpeg 推流mp4文件(附源码下载)
源码地址https://github.com/979451341/Rtmp 1.配置RTMP服务器 这个我不多说贴两个博客分别是在mac和windows环境上的,大家跟着弄 MAC搭建RTMP服务器h ...
- Android 音视频深入 九 FFmpeg解码视频生成yuv文件(附源码下载)
项目地址,求star https://github.com/979451341/Audio-and-video-learning-materials/tree/master/FFmpeg(MP4%E8 ...
- 为何要打印日志?C++在高并发下如何写日志文件(附源码)?
为何要打印日志?让程序裸奔不是一件很快乐的事么? 有些BUG就像薛定谔的猫,具有波粒二象性,当你试图去观察它时它就消失了,当你不去观察它时,它又会出现.当你在测试人员面前赌咒发誓,亲自路演把程序跑一遍 ...
- 轻量级通信引擎StriveEngine —— C/S通信demo(2) —— 使用二进制协议 (附源码)
在网络上,交互的双方基于TCP或UDP进行通信,通信协议的格式通常分为两类:文本消息.二进制消息. 文本协议相对简单,通常使用一个特殊的标记符作为一个消息的结束. 二进制协议,通常是由消息头(Head ...
- C#轻量级通通讯组件StriveEngine —— C/S通信开源demo(2) —— 使用二进制协议 (附源码)
前段时间,有几个研究ESFramework通信框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好友关 ...
随机推荐
- 希腊字母、拉丁字母、Markdown、拼写与读音中英对照表
大写 小写 中文名 英文 大写Markdown 小写Markdown 意义 阿尔法 Alpha A \alpha 角度.系数.角加速度.第一个.电离度.转化率 贝塔/毕塔 Beta B \beta 磁 ...
- 在server2012安装tfs遇到的问题:KB2919355
参考资料:http://blog.csdn.net/wo_984633714/article/details/52869851 安装tfs2015的时候,提示需要安装KB2919355的更新.然后我就 ...
- Django命令行相关命令 以及创建一个空白网页的步骤
django相关命令行命令: django.admin.py是Django的一个用于管理任务的命令行工具,manage.py是对django-admin.py的简单包装,每个Django Projec ...
- android 控件注意点
控件一:listview 问题一:当listview的item中存在按钮这种控件时 item点击不能响应问题? 解决方案:在item的自定义控件的最外层空间 上添加属性 android:descend ...
- TCP TIME_WAIT详解
转自:http://m.blog.chinaunix.net/uid-20384806-id-1954363.html TIME_WAIT状态 TCP要保证在所有可能的情况下使得所有的数据都能够正确被 ...
- jmeter命令行运行-分布式测试
上一篇文章我们说到了jmeter命令行运行但是是单节点下的, jmeter底层用java开发,耗内存.cpu,如果项目要求大并发去压测服务端的话,jmeter单节点难以完成大并发的请求,这时就需要对j ...
- HTML5扩展之微数据与丰富网页摘要itemscope, itemtype, itemprop
HTML5扩展之微数据与丰富网页摘要 by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpr ...
- 关于数据汇总方面返回Json数据的小小心得
在一开始的开发中,计算好相关数据,然后通过 1.拼串 2.实例化Dictory对象再通过JavaScriptSerializer转换为json. 其中,2只适合于二维数据.1适合多维数据,但拼串比较费 ...
- Python初识与简介【开篇】
目录 1.扯淡 2.Python历史 3.Python简介 4.Python应用 5.为什么是python而不是其他语言? 6.Python的种类 7.Python的特点 8.Python设计哲学 9 ...
- Python学习笔记——基础篇【第二周】——解释器、字符串、列表、字典、主文件判断、对象
目录 1.Python介绍 2.Python编码 3.接受执行传参 4.基本数据类型常用方法 5.Python主文件判断 6.一切事物都是对象 7. int内部功能介绍 8.float和long内 ...