抱有演示DEMO的简要表明,DIOCP开源项目

【DIOCP-DEMO说明】所有演示DEMO的简要说明,diocp-demodemo

samples目录下面为自带的DEMO

发现有很多朋友不知道如何开始DIOCP,下面是DEMO的简单说明,希望对大家有用

C#\Simple
  用C#写的一个简单的回传测试,服务端开启ECHO服务器即可
 
samples\ECHO
  IOCP回射测试,在服务端收到数据后立即发送回客户端,
  可以从这个DEMO看出如何在服务端接收数据,返回数据。
 
samples\iocpTask
  iocpTask演示DEMO,异步任务执行DEMO,
 
可以在该DEMO中学到,如何投递任务让主线程去执行(访问UI最好在主线程访问)。
  可以学到如果注册信号任务,如何触发信号任何,如何反注册信号。
   
信号任务可以在一个位置进行注册,在子线程中通过信号进行触发,可以有效的进行解耦你的代码。
  更多的功能可以使用QDAC3中的QWorkers
 

samples\qdac3-source
  qdac3项目源码, 优秀的开源项目,你可以更新到qdac项目中去更新最新版,
  一些DEMO中有使用到。
 
samples\safeLogger
  SafeLogger的使用DEMO,
  可以在该DEMO中学习到如何使用SafeLogger将日志显示到MEMO,
  如何使用SafeLogger将日志记录到文件。
 
samples\simple
  最简单的DIOCP使用例子
 
客户端采用阻塞模式,发送数据到服务端,然后服务端自己返回,客户端等待接收数据.

>>>>>>DIOCP讨论群:320641073

 

samples\socket-Coder
 
编码器方式的DEMO,编码器模式的存在可以让大家在使用DEMO的时候直接传递对象,而不用你去处理粘包问题,
 
编码器模式在解码成功后将接收到的对象投递到iocpTask/qworkers的线程中去执行,这样不会阻塞diocp的通信线程,即使在处理复杂的业务逻辑,也不影响到数据的接收和发送。
 
samples\socket-Coder\diocpCoders
  常用的一些编码和解码器,
  JsonStream: 包含一个Json和一个Stream 
  TStream : 通用简单的TStream对象,头标记 + CRC + 数据长度 + 数据
  TMsgPackCoder: msgpack对象。使用Qmsgpack进行解析
 
 
推荐搭建使用TStream的编码和解码模式,因为很多对象都能序列化到流和从流中还原。
  例如 msgpack -> TStream -> diocp -> TStream ->msgpack
 
samples\socket-Coder\StreamCoder
  Stream编码器模式例子。
 
可以在该DEMO中学习到如果直接发送一个TStream对象,如何在服务端中接收到到这个对象,如果将一个Stream对象推送给客户端。
  可以在该DEMO学习到iocpCoderClient(客户端iocp)的使用。
  客户端有阻塞模式(RawTcpClient)和异步接受(Client)模式。
 
samples\socket-Coder\DataModuleDEMO-Andriod
  手机Andriod客户端与diocp服务器交换数据的例子
 
可以学习到如何在andriod中请求diocp执行sql语句返回一个TClientDataSet的数据,并在手机上进行显示
 
samples\socket-Coder\DataModuleDEMO
  三层数据演示
 
可以学习到如何在客户端中请求diocp执行sql语句返回一个TClientDataSet的数据,并在客户端进行显示
samples\socket-Coder\DataModuleDEMO-SimpleMsgPack
  使用simpleMsgPack代替QMsgPack,可以在D7中使用
 
samples\socket-Coder\DIOCPFileSERVER
  演示DIOCP如何作为文件服务器使用
  可以学习到如果分块上传文件和下载文件

samples目录下面为自带的DEMO
发现有很多朋友不知道如何开始DIOCP,下面是DEMO的简单说…

>>>>>>SVN源码和DEMO下载:

网络带宽有限,对数据进行压缩再进行传送可以有效的利用带宽和提高传输的效率。

DIOCP中对数据进行压缩传送,需要修改编码器和解码器,先说说这两个东西的的用法和功能。

      

         

         

         
在之前编写的DIOCP例子中都使用了JSonStream对象进行传输,这个TJSonStream类,主要有两个部分的数据,第一部分包含JSon字符串数据,第二部分包含Stream流数据。在三层数据保存例子中我们把客户端的请求放在JSon中。服务端接收数据后通过服务端的解码器还原成JSonStream对象。然后进行逻辑的处理,服务端回写对象时,同过服务端的编码器对回写的JSonStream进行编码发送,客户端通过客户端的解码器接收并还原成JSonStream对象。在服务端回写CDS数据包时将xml字符串数据写在JSonStream.Stream中,如果对Stream对象进行压缩,在做压缩中调试程序时发现一个70K的数据包进行一下压缩,数据包可以变成7K了,对文本压缩效果还是很不错的。

       

        下面分析下代码

客户端代码:

==] := ;   //] :=;

首先是建立一个TJSonStream对象,然后设定信息,因为是发生SQL所以没有Stream数据。后面是用FClientSocket.sendObject(lvJSonStream);//用Socket进行发送,

   FCoder =    Exception.Create(  Active ;

可以看出这里调用注册的编码器,调用Encode函数

 

客户端编码器的Encode函数如下

[..] 
   pvObject =  =// (lvJSonStream.Stream <> ) 

     lvJSonStream.Json.O[] <>  

       lvJSonStream.Json.B[] 

        //   lvJSonStream.Stream.Size >  

      //] :====== pvSocket.sendBuffer(@lvJSonLength, SizeOf(lvJSonLength)) = SOCKET_ERROR  lvStream <>  
  = 
  = = pvSocket.sendBuffer(@lvStreamLength, SizeOf(lvStreamLength)) = SOCKET_ERROR // pvSocket.sendBuffer(@lvBytes[], Length(lvBytes)) = SOCKET_ERROR  lvStream.Size >  
  = = pvSocket.sendBuffer(@lvBufBytes[], l) = SOCKET_ERROR  (l = ;

该部分完成的功能有

1.判断Stream数据是否需要压缩。

2.发送Json数据长度和Stream数据长度

3.发送Json数据

4.发送Stream数据

 

说明:

lvJSonLength := TNetworkTools.ntohl(lvJSonLength);
lvStreamLength := TNetworkTools.ntohl(lvStreamLength);

lvData := TNetworkTools.Utf8Bytes2AnsiString(lvBytes);

这三行代码需要说明下,是为了兼容java,netty做服务端方便解码,当然我们也可以不进行转换。直接发送也是可以的。只要配合服务端就行了。协议是自己定义的。

 

接下来是服务端IOCP队列中会收到接收数据的信号。

=//= lvIOData.IO_TYPE = IO_TYPE_Accept   //   lvIOData.IO_TYPE = IO_TYPE_Recv 

      ////;

 

//加入到套接字对应的缓存中,处理逻辑
lvClientContext.RecvBuffer(lvIOData.DataBuf.buf,
  lvIOData.Overlapped.InternalHigh);

//这里会调用解码器尝试进行解码

    ////调用注册的解码器<进行解码>= lvObject <>  


        //
         +//清理掉这一次分配的内存<如果没有可用的内存块> FBuffers.validCount =  
      ;

 

我们在之前的Demo中使用的是TIOCPJSonStreamDecoder解码器

 

 TIOCPJSonStreamDecoder.Decode( = //如果缓存中的数据长度不够包头长度,解码失败<json字符串长度,流长度>= (lvValidCount < SizeOf(Integer) + SizeOf(Integer)) 
  //==//如果缓存中的数据不够json的长度和流长度<说明数据还没有收取完毕>= lvValidCount < (lvJSonLength + lvStreamLength) 

    //   (lvJSonLength + lvStreamLength) =  

    //两个都为0<两个0>//==// lvJSonLength >  
  == 
  , // lvStreamLength >  
  = // lvJsonStream.Json.B[] 

        //;

//服务端解码器中有三行代码来配合客户端的编码流

lvJSonLength := TNetworkTools.ntohl(lvJSonLength);
lvStreamLength := TNetworkTools.ntohl(lvStreamLength);   
lvData := TNetworkTools.Utf8Bytes2AnsiString(lvBytes);

/////

服务端解码器主要完成的功能有

0.判断接收到的数据是否可以进行解码,如果不可以退出,解码不成功。

1.接收json长度,流数据长度

2.接收json数据,接收流数据存入JsonStream.json中,

3.根据json中config.stream.zip进行判断流数据是否需要解压.放入JsonStream.stream中
4.解码成功返回JsonStream对象。

 

解码完成后可以看到

=

lvObject <>

//

 

SVN源码和DEMO下载:
网络带宽有限,对数据进行压缩再进行传送可以有效的利用带宽和提高传输的效…

相关文章