DIOCP开源项目-DIOCP3 大文件的传输DEMO<断点续传>

简介: 首先该DEMO在StreamCoder上面做的改动,期间导致StreamCoderDEMO经常出现问题,导致大家运行的时候,频频出现问题,表示道歉。 以下是测试的结果,从服务器下载传输了一个3G左右的文件(Win7.iso)。

首先该DEMO在StreamCoder上面做的改动,期间导致StreamCoderDEMO经常出现问题,导致大家运行的时候,频频出现问题,表示道歉。

以下是测试的结果,从服务器下载传输了一个3G左右的文件(Win7.iso)。传输后用Hash工具做了个测试,是一样的。后面贴出了两个文件的贴图。

K6V9QY1LDQMBF)1JXN~K3`O

 

 

下面是客户端接受到文件的hash截图

Z`Z]T4H(M3(2H0FI]B)X1OG

 

下面是服务端源文件的hash截图

P~WNR$Y{X~L}8(2HV[}C)CI

 

协议和功能

该DEMO由客户端请求服务端位与Files下面的文件,第一次请求文件信息(文件大小),请求到文件后,请求下载文件数据,收到后重复继续请求下载下一块文件数据,直到所有数据完成。

该DEMO的Stream文件头写入了该结构体信息。

TFileHead = record
  Flag: Word;    //固定$A1标记
  cmd: Word;   // 1, 请求文件数据, 2: 文件数据, 10: 请求文件信息, 11: 文件信息数据
  FileName: string[255];  //文件名
  Position: Int64;   //文件位置<请求文件数据时指定读取文件数据的位置>
  Size: Int64;          //数据大小<请求文件数据时表示请求的数据大小;返回文件数据(2)时,表示数据的大小。
  crc: Cardinal;      //暂时没有试用
  cmd_result:Integer;  //  0:成功, 1:文件找不到, 2:出现了异常, 3:错误的请求参数

end;

由于下载数据的位置和大小可以由请求中进行指定,所以可以进行断点续传,这是我平常用到的协议。

 

部分代码讲解

 

客户端由一个IocpFileTrans类完成主要的功能。

 

image

改按钮代表请求下载服务端Files\demoFile.jpg文件。

procedure TfrmMain.btnGetFileClick(Sender: TObject);
begin
  if not FiocpCoderTcpClient.isActive then
  begin
    uiLogger.logMessage('please do connect');
    exit;
  end;

  FFileAsyncTrans.requestFileINfo(edtFileID.Text);
end;

 

请求有回应后(onRecvObject),进行文件数据的请求

image

 

接收到数据后(onRecvObject),写入数据后,继续请求下一块数据,所有数据(Postion = size)完成,关闭文件,完成下载。

image

 

 

服务端有MyClientContext类处理客户端的请求和返回数据的工作

请求文件信息命令,  返回文件信息,(文件大小:lvResult.size)

image

 

请求文件数据,返回读取的文件大小(lvResult.Size), 和文件数据lvFileData

image

 

最后将文件头信息和文件数据合并到Stream中,用writeObject方法返回给客户端。

image

 

上面讲述了客户端和服务端文件处理的流程部分的代码。该DEMO只是一个演示,希望能加深大家对diocp的理解。

 

 

 

DEMO路径存放 samples\iocp-coder\streamCoder

注意:请求的文件必须存在输出路径的Files目录下面,

         客户端请求的文件,只需要Files目录下面对应的文件名

目录
相关文章
|
数据库
Diocp截图
跑了个数据库的查询和插入,删除。     Http SVR DEMO http://123.232.98.202:8081/
679 0
|
网络协议 数据处理 Windows
DIOCP 运作核心探密
原文连接: http://blog.qdac.cc/?p=2362 原作者: BB   来自网友天地弦的DIOCP早已经广为人知了,有很多的同学都用上了它,甚至各种变异、修改版本也出了不少。我最近也在学习DIOCP,打算将它用于自己的服务端,今天让我们来一起探密它(DIOCP)的运作核心吧。
1528 0
|
SQL 数据库 网络协议
[DIOCP3/MyBean/QDAC开源项目] DataModule-DB例子基于MyBean的插件实例<三层数据库方案>
【说明】 这个例子答应大家很久了,一直没有时间弄,现在正式结合MyBean插件可以很方便的在客户端共享操作连接,执行数据库的各项工作,屏蔽了底层的通信解码器编码等工作,直接传递Variant,给了开发者足够的领活和自由。
1291 0
|
调度
[DIOCP3-IocpTask说明书]基于IOCP引擎的多线程任务的投递和回调处理单元
【说明】 IocpTask是基于Iocp引擎的多线程任务投递和处理单元,可以方便的把任务进行投递到IOCP线程进行统一调度和处理,是模仿QDAC-QWorker的处理方式,支持D7以上的版本。 【使用方法】 使用上很简单,下面解释一种比较全面的方法: procedure PostATas...
823 0
|
缓存
DIOCP3 - 关于接收数据
DIOCP3支持两种方式接收数据,   第一种是原始的流数据, 最通用的一种方式,客户端发啥,这边就收到啥。需要自己处理粘包问题。 可以在TCilentContext或者TIocpTcpServer的OnRecvBuffer中处理, 如果Errcode = 0可以进行收到数据的处理 下面这两...
765 0
|
数据格式
DIOCP3-关于TIOCPConsole和编码解码器
TIOCPConsole是继承至TIocpTcpServer,做了管理和调用编码和解码器器的功能。可以通过向他注册编码和解码器可以忽略粘包的问题。   这样如果TIOCPConsole客户端必须按照一定的编码器和解码器的协议发送数据和接受数据, diocpCoders中已经有了几种编码和解码器, 比较常用的TDIOCPStreamCoder 他的格式是Pack_Flag + streamLen + Stream数据 如果不是这种数据格式会认为是客户端在攻击服务器会被T掉。
878 0
DIOCP开源项目-DIOCP3的ECHO测试<贴图>
星期六开了测试台测试机子。星期天休息,今天早上来接两个图 开了2个客户端,一个qsl的echo client,一个是楠楠的dbiocp回调客户端。建立13240个连接 今天来后,机子很卡,后来发现是楠楠的dbiocp导致的。
1140 0
DIOCP开源项目-DIOCP3直接发送对象,帮你处理粘包问题
该DEMO演示,如何在客户端与服务端之间直接传递TStream对象,让你专注于处理数据逻辑,可以忽略处理网络传输间粘包的问题。 上面由服务端向所有的客户端推送一个消息TMemoryStream对象(该对象为字符串数据)。
910 0
DIOCP开源项目-DIOCP3重写笔记-1
这几天在在重新DIOCP3,基本工作已经初步完成,进入测试阶段,今天加入排队投递,本认为是个很简单的工作,稍微不注意,留了两个坑,调了7,8个小时,刚刚总算找到问题,记录一下, 关于排队投递的流程 这是投递一个TIocpSendRequest的流程,投递开始,投递一块数据,最大50K,如果超过50K则分批进行投递。
780 0
|
消息中间件 网络协议 缓存
DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了
[概述] 自从上次发布了[DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端]文章后,得到了很多朋友的支持和肯定。这加大了我的开发动力,经过几个晚上的熬夜,终于在昨天晚上,DEMO基本成型,今天再加入了QWorkers来做逻辑处理进程,进一步使得逻辑处理进程更加方便和高效。
1235 0