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

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使用例子
  客户端采用阻塞模式,发送数据到服务端,然后服务端自己返回,客户端等待接收数据.
 
=================================================================================
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如何作为文件服务器使用
  可以学习到如果分块上传文件和下载文件

【DIOCP3-说明书】关于DIOCP3服务端常见的问题

这几天群里面使用DIOCP3的人越来越多,一般或多或少都会碰到一些问题,碰到问题并不可怕,可怕的是不知道如果下手去查找问题,解决问题。服务端的编写都一样,需要小心谨慎,毕竟我们要写的程序是需要长期运行的,不能有半点马虎。每一行代码都要认真对待,我现在把大家碰到的问题整理下,希望大家碰到问题时,好好检查下代码,看看是不是也有类似的问题。

 

第一,也是很多人容易犯的错误,不要在diocp3事件中,直接访问UI

    这个情况几乎我每次都强调,但基本上90%的人都犯这样的错误,因为diocp3中,所有的事件都在线程中触发的,UI资源一般都不是线程安全的,直接访问UI,一般会锁死线程,程序退出时无法退出进程,而且会出现不可预料的错误。
   日志记录方面如果要显示到Memo中,请使用线程日志安全类SafeLogger,可以参考safelogger的demo,虽然Memo是做的SendMessage处理,还是不建议直接在线程池对Memo直接进行操作

 

第二,访问违规错误。

    首先跟踪下代码看看,访问违规的错误代码是哪一行引起的,看看对象是否提前是否,或者是公用的对象,如果是公用的对象是否有做临界处理。如果异常停留在diocp底层的代码,多数情况下面是程序栈帧被破坏,检查下指针操作的位置(move,copyMemory的位置)看看目标指针是否有越界和指定错误的情况。建议应用层,少用指针和结构体,用操作对象或者内存流来代替结构体和指针操作。

 

第三,日志的问题。

    diocp底层记录日志在Debug模式下面记录日志比较详细,每个连接的断开<包括主动和对方断开>都做了日志记录。那些日志一般都是正常存在的。

 

第四,心跳和重连。

    diocp3中有设置KeepAlive的选项,但是这个选项不是万能的,有很多客户端突然断线,或者某些机器上面会不起作用。这个时候需要做业务层的心跳包,一般处理方法是,客户端定时发送很小的数据包,到服务端,服务端做轮询的超时检测,把超时的连接主动在服务端T掉,客户端在发送数据包的过程中也可以触发没有正常连接的异常,然后进行重连。

 

最后再强调下,服务端编程,要处理要多线程资源访问的问题,注意好指针操作。要写出稳健的服务端,还需要逻辑代码和diocp3的配合,需要谨慎对待。

[DIOCP3-说明书] 关于DEMO的编译

总有些朋友问我,关于DEMO编译的一些问题,每次都回答大概都差不多,我想还是写篇说明书给大家,关于DEMO编译的步骤。

【环境设定】

1.将DIOCP3\source路径添加到Delphi的搜索路径,[tool->options->Environment Options->Delphi Options –> Libaray –>Libaray Path]

2.打开samples\下面的工程可以进行编译

【常见问题】

1.XE2以上版本,有时候提示一些vcl的单元找不到。

image

解决方法:

工程添加vcl域

image

2. XE2以下版本提示找不到System.actions;

image

解决方法

直接删除即可(一些DEMO在XE5和XE6上面完成的,这个是自动添加的,低版本没有,可以直接删除)

3. D7 下面提示, Application.MainFormOnTaskbar := True;编译不过去

image

解决方法:

直接删除即可,D7不认识这段代码,这是2007以上版本自动生成的。