随笔分类 - Delphi-IOCP

摘要: 前几天有个朋友,说他们公司做手游,服务端用的DIOCP3里面做文件服务器,客户端用cocos-x,在调试与diocp通信时老是失败!于是,我下载了一个Codeblocks经过几个小时的折腾,终于折腾出来了,把其中的一些心酸记录下,以便以后查阅。1.windows下面使用socket的一些函数时,需要...阅读全文
posted @ 2015-03-05 23:48 D10.天地弦 阅读(937) | 评论 (0) 编辑
摘要: DIOCP3除了有详细的监控面板之外,还有详细的输出日志,当然需要打开日志编译开关! 在工程选项加入DEBUG编译指令,这样在运行中就可以看到DIOCP3的运行详细日志 日志输出在EXE相同目录的LOG文件夹下面。 日志说明: 8276_iocpSVR_2015010712.log 8276 是进程ID iocpSVR是程序中iocpTcpSERVER的名字 2...阅读全文
posted @ 2015-01-07 12:43 D10.天地弦 阅读(452) | 评论 (2) 编辑
摘要: 案例1DIOCP是Delphi下进行IOCP服务端通讯开发的一个非常好的开源框架,稳定、高效并且使用起来十分简单。 自己两个多月之前因为需要使用Delphi开发一个TCP服务端,当时也是到处爬文,希望找到一个稳定且好用的IOCP开源框架,整整一周的时间,看了很多,也对比了很多,最后选择了DIOCP,...阅读全文
posted @ 2014-12-16 09:15 D10.天地弦 阅读(1162) | 评论 (0) 编辑
摘要: 由于360改变了共享策略,导致之前的共享连接不能使用重新共享了下。http://yunpan.cn/cgS2DBRT572jy(提取码:1eda)阅读全文
posted @ 2014-10-04 19:20 D10.天地弦 阅读(571) | 评论 (0) 编辑
摘要: 服务器的连接上限是到底是多少?diocp3开源项目的一个装13测试(8W连接数)测试DEMO路径diocp3\samples\ECHO之前群里说一台服务器最多是High(Word)的连接数65535,当时我看了下socket的类型是u_long,并不是word,虽然不用那么多连接数,虽然当时润哥做过...阅读全文
posted @ 2014-09-29 11:26 D10.天地弦 阅读(1427) | 评论 (0) 编辑
摘要: 【说明】这个例子答应大家很久了,一直没有时间弄,现在正式结合MyBean插件可以很方便的在客户端共享操作连接,执行数据库的各项工作,屏蔽了底层的通信解码器编码等工作,直接传递Variant,给了开发者足够的领活和自由。【服务端使用技术】diocp3:担当底层的通信任务。qworker/iocpTas...阅读全文
posted @ 2014-09-05 11:52 D10.天地弦 阅读(3056) | 评论 (6) 编辑
摘要: socket-Coder\DataModuleDEMO\ 本DEMO演示数据库的简单使用,其他功能需要自己扩展。 将工程的输出路径设置到socket-Coder\DataModuleDEMO\BIN下面 服务端使用的Access数据库 可以改连接使用其他数据库 DataModuleDEMO\BIN\diocp3Server.db.ini阅读全文
posted @ 2014-08-26 00:01 D10.天地弦 阅读(486) | 评论 (0) 编辑
摘要: DIOCP3兼容DIOCP1的,有些属性做了修改 DIOCP3, uIOCPConsole没有了, uMemPool没有了 1.DIOCP1,代码: DIOCP3中去掉TIOCPContextFactory, 可以直接往TIocpConsole(uIocpCentre单元中)对象上注册。TiocpConsole有对应的方法 这样可以每个TIocpConsole有自己独立的编码和解...阅读全文
posted @ 2014-08-25 21:58 D10.天地弦 阅读(503) | 评论 (0) 编辑
摘要: TIOCPConsole是继承至TIocpTcpServer,做了管理和调用编码和解码器器的功能。可以通过向他注册编码和解码器可以忽略粘包的问题。 这样如果TIOCPConsole客户端必须按照一定的编码器和解码器的协议发送数据和接受数据, diocpCoders中已经有了几种编码和解码器, 比较常用的TDIOCPStreamCoder 他的格式是Pack_Flag + stream...阅读全文
posted @ 2014-08-25 16:32 D10.天地弦 阅读(430) | 评论 (0) 编辑
摘要: 什么是粘包: 第一次发送 12345, 第二次发送abcde, 底层socket可能会一次性进行发送12345abcde,或者对方可能一次性进行了接收,那接收的时候,你可能想分两次接收才对,第一次接受到12345, 第二次想接收abcde,但是事与愿违,一次就接收完了,这就是粘包的问题。需要自己处理, 怎么样处理粘包: 常见的方法是在包数据的前面加长度比如我先发送一个字节代...阅读全文
posted @ 2014-08-25 14:27 D10.天地弦 阅读(565) | 评论 (1) 编辑
摘要: DIOCP3支持两种方式接收数据, 第一种是原始的流数据, 最通用的一种方式,客户端发啥,这边就收到啥。需要自己处理粘包问题。 可以在TCilentContext或者TIocpTcpServer的OnRecvBuffer中处理, 如果Errcode = 0可以进行收到数据的处理 下面这两个都会触发 TIocpClientContext procedure OnRecvBuffer(...阅读全文
posted @ 2014-08-25 14:13 D10.天地弦 阅读(687) | 评论 (0) 编辑
摘要: 昨天有个多年的群友(B3.Locet)用LoadRunner11对DIOCP3做压力测试,说测试的时候出现了大量的10053,10054的报告。昨天晚上下载了个LoadRunner11, 今天捣鼓了下。没用过这么高级的东西,LoadRunner是专业的测试工具,用来测试DIOCP3 Echo测试服务...阅读全文
posted @ 2014-08-12 12:32 D10.天地弦 阅读(1427) | 评论 (0) 编辑
摘要: 首先该DEMO在StreamCoder上面做的改动,期间导致StreamCoderDEMO经常出现问题,导致大家运行的时候,频频出现问题,表示道歉。以下是测试的结果,从服务器下载传输了一个3G左右的文件(Win7.iso)。传输后用Hash工具做了个测试,是一样的。后面贴出了两个文件的贴图。下面是客...阅读全文
posted @ 2014-08-10 20:31 D10.天地弦 阅读(2730) | 评论 (3) 编辑
摘要: 该DEMO演示,如何在客户端与服务端之间直接传递TStream对象,让你专注于处理数据逻辑,可以忽略处理网络传输间粘包的问题。上面由服务端向所有的客户端推送一个消息TMemoryStream对象(该对象为字符串数据)。代码解释:procedure TfrmMain.actPushMsgExecute...阅读全文
posted @ 2014-08-05 23:25 D10.天地弦 阅读(1339) | 评论 (0) 编辑
摘要: DIOCP3的重生从开始写DIOCP到现在已经有一年多的时间了,最近两个月以来一直有个想法做个 30 * 24 稳定的企业服务端架构,让程序员专注于逻辑实现就好。虽然DIOCP到现在通讯层已经很稳定了,但是要做如果做这种架构,发现还有诸多不便。于是,有了重写DIOCP的想法。关于开源服务器的选用:前...阅读全文
posted @ 2014-08-03 23:47 D10.天地弦 阅读(6147) | 评论 (4) 编辑
摘要: 这几天在在重新DIOCP3,基本工作已经初步完成,进入测试阶段,今天加入排队投递,本认为是个很简单的工作,稍微不注意,留了两个坑,调了7,8个小时,刚刚总算找到问题,记录一下, 关于排队投递的流程 这是投递一个TIocpSendRequest的流程,投递开始,投递一块数据,最大50K,如果超过50K则分批进行投递。流程是没错,我刚开始的写法是: 其中InnerPostRequest是...阅读全文
posted @ 2014-08-01 00:20 D10.天地弦 阅读(552) | 评论 (0) 编辑
摘要: [概述]自从上次发布了[DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端]文章后,得到了很多朋友的支持和肯定。这加大了我的开发动力,经过几个晚上的熬夜,终于在昨天晚上,DEMO基本成型,今天再加入了QWorkers来做逻辑处理进程,进一步使得逻辑处理进程更加方便和...阅读全文
posted @ 2014-05-28 23:24 D10.天地弦 阅读(8476) | 评论 (13) 编辑
摘要: 3个逻辑处理进程 + DIOCP通信服务器(5K连接) + 5个客户端 运行半个小时,无丢包,数据完整 群内无毒公主 10K连接 , 逻辑处理进程未知 50分钟,所有客户端关闭阅读全文
posted @ 2014-05-28 00:51 D10.天地弦 阅读(866) | 评论 (0) 编辑
摘要: 最近头脑里面一直在想怎么样让能让大家基于DIOCP上写出稳定的服务端程序。很多朋友问我,你DIOCP稳定吗,我可以用他来做三层服务器吗? 当时我是这样回答的,我只能保证DIOCP底层通信的稳定。说实话,服务端要稳定,并不容易,写过服务端的程序员都清楚。特别是这种可以直接操作指针,自己分配内存和释放内...阅读全文
posted @ 2014-05-25 09:11 D10.天地弦 阅读(2786) | 评论 (1) 编辑
摘要: 最近想在DIOCP中加入任务调度线程,DIOCP的工作线程作为生产者(producer)将接受到的数据对象,投递到任务调度线程中,然后统一进行分配。然而这一切都需要一个队列, 这几天都在关注无锁队列。[队列]首先是一个队列,简单的队列就是,生产者把数据压入队列(push), 消费者通过队列Pop出数...阅读全文
posted @ 2014-05-11 22:04 D10.天地弦 阅读(5479) | 评论 (4) 编辑
摘要: DIOCP自开源以来,得到了很多朋友的测试,并进行了诸多的改进,现在已经运用到了一些具体的项目当中。DIOCP底层运行稳定。昨天做了个ECHO测试,这个连接数并没有达到上限。 11K 连接,1个半小时,没有断线,被T 服务端内存占用稳定 cpu占用也不高阅读全文
posted @ 2014-02-20 10:01 D10.天地弦 阅读(384) | 评论 (0) 编辑
摘要: 印象中网络程序都是sendBuffer和recvBuffer来发送数据和接收数据,本次Demo演示如何定义定义一个自己的对象,然后我们按照OO的思想直接进行对象的发送和接收,先上个流程图。下面是客户端发送和接收的测试代码。下面我们来看看详细的设计。第一步(TMyObject):首先我们需要设计一个需要进行传输的对象.type TMyObject = class(TObject) private FDataString:String; FOle:OleVariant; public property DataString:String read FDataString write F...阅读全文
posted @ 2013-10-14 19:12 D10.天地弦 阅读(1650) | 评论 (3) 编辑
摘要: 经过昨天晚上一折腾把做了一个DIOCP直接传递TADOQuery的Demo,在google上找了一系列的资料。这样服务端可以直接将TADOQuery查询出来的数据直接转换成TStream自己进行传递,到客户端用一个TADOQuery对象还原流就可以了。两种方法导出的数据格式是一样的方法一是将recordset保存成流接口->转成OleVariant ->写入流class function TADOTools.saveToStream2( pvDataSet: TCustomADODataSet): TMemoryStream;var AStream:_Stream; V:OLEVa阅读全文
posted @ 2013-10-13 12:44 D10.天地弦 阅读(1665) | 评论 (1) 编辑
摘要: 很久没有写DIOCP的Demo了,主要公司的事情太繁琐,工作之余都不想动了,之前承若的群里面朋友们的DEMO,昨天晚上恶补了一下,把对数据库连接池的操作加入到了Demo中,大家可以通过SVN下载到最新的代码和Demo。 好了我带大家看看这次的DEMO,经过群里面朋友们的推荐,这次代码中引用了UntCobblerUniPool连接池代码来完成的本次的DEMO,研究了下代码,里面使用的线程时钟来做死连和多余连接的释放。感谢UntCobblerUniPool作者无私奉献的精神。 先截个图,看看服务端的界面。主要加入了多帐套的连接的配置。配置文件存放在config\dbpool.config,是一个.阅读全文
posted @ 2013-09-17 10:56 D10.天地弦 阅读(2555) | 评论 (2) 编辑
摘要: 今天群里有个朋友说他们医院项目采用直连数据库,高峰时期sqlserver的连接数达到7000多,于是我准备做个用diocp做个demo,服务端用连接池。白天的时候我在想,并发如果7000个。如果用diocp做三层服务器,连接池应该在100个左右。今天晚上奋斗了一晚上,准备把测试过程中碰到的问题总结一...阅读全文
posted @ 2013-06-09 00:39 D10.天地弦 阅读(4929) | 评论 (5) 编辑
摘要: >>>>>>DIOCP讨论群:320641073>>>>>>SVN源码和DEMO下载:https://code.google.com/p/diocp/ 网络带宽有限,对数据进行压缩再进行传送可以有效的利用带宽和提高传输的效率。DIOCP中对数据进行压缩传送,需要修改编码器和解码器,先说说这两个东西的的用法和功能。 举个例子:我们要把一台电脑快递回老家给正在上学的小弟使用,那么老家就是服务端(S),电脑就是我们要发送的对象(O),快递就是TCP传输过程。在这个过程中,发送一个对象(电脑)用到客户端的编码器,接收对象(电脑)用阅读全文
posted @ 2013-05-30 13:00 D10.天地弦 阅读(1975) | 评论 (0) 编辑
摘要: 经过两天时间的开源,感谢网友提出一些修改意见,特别是在XE中,做了一部分优化。可以在SVN中下载到最新的代码https://code.google.com/p/diocp/今天做了一个操作数据库的演示<这里我拿出我在实际项目中操作数据库的方法,集成在Demo中>操作数据库比较简单,分两部分功能,第一部分打开SQLprocedure TfrmMain.btnOpenSQLClick(Sender: TObject);var lvJSonStream, lvRecvObject:TJsonStream; lvStream:TStream; lvData:AnsiString; l, j阅读全文
posted @ 2013-05-20 17:35 D10.天地弦 阅读(3204) | 评论 (2) 编辑
摘要: 经过对一段时间对IOCP的学习和研究。对IOCP的流程有了一定的了解。后面对一段时间的IOCP优化和实际项目的使用,在DIOCP中加入了日志文件记录功能,利用api编写了一个客户端通信类,等解决了很多bug,并已使用在公司的项目中,现运行稳定。今天对IOCP退出时资源的释放,做了最后一步研究和优化。为了方便大家学习,我把这个项目命名为DIOCP,上传在google的SVN项目中https://code.google.com/p/diocp/大家可以通过svn下载代码,里面我写了一个Echo的测试Demo,准备后续加入聊天等Demo。特地为DIOCP开设了一个群:320641073,欢迎学习的I阅读全文
posted @ 2013-05-18 16:26 D10.天地弦 阅读(1399) | 评论 (0) 编辑
摘要: Delphi-IOCP 共同学习研究群号 320641073iocp的学习和交流。阅读全文
posted @ 2013-05-11 16:28 D10.天地弦 阅读(228) | 评论 (0) 编辑
摘要: 经过一段时间的研究和学习,对IOCP的原理和流程都有了一定的了解,测试的Demo结果显示在局域网内轻轻松松处理5000个左右的连接,还是比较稳定的。运行Echo测试几个小时后。服务端内存稳定在60M左右。这两天对原始代码进行了封装,封装成了一套IOCP类。原始的API调用,对于研究和学习IOCP的原理还是比较好的。封装后,如果没有较好的文档,可能比较难理解。1.发送数据流程图2.服务回写数据流程2.IOCP对象中心2.1 TIOCPObject IOCP对象中心,创建IOCP句柄,开启侦听端口。 提供处理数据,接收套接字,投递接收请求,投递发送请求。 2.2 TIOCPClientCon...阅读全文
posted @ 2013-04-27 16:17 D10.天地弦 阅读(939) | 评论 (2) 编辑
摘要: 刚刚的测试,服务端上图开了5个客户端<每个客户端1000>进行测试。内存视乎不是很多。客户端的发过来的数据包大小在4096+88字节左右。测试Echo测试线程procedure TfrmMain.btnEchoTesterClick(Sender: TObject);var lvEchoTester:TEchoTester; i:Integer;begin for I := 1 to StrToInt(edtCount.Text) do begin lvEchoTester := TEchoTester.Create; lvEchoTester.TcpClient.Host...阅读全文
posted @ 2013-04-25 09:21 D10.天地弦 阅读(2133) | 评论 (2) 编辑
摘要: 现在IOCP的功能还剩下服务端数据的返回。还是采用netty的方式。netty返回数据的调用是这样的contenxt.write(<TObject> obj);这样将obj对象发送给客户端。1.将回传的对象进行编码成buffer2.通过socket进行传送.>>>>>>>>>>>>>>下面我贴出回传数据的过程.procedure TClientContext.writeObject(const pvDataObject:TObject);var lvOutBuffer:TBufferLink;beg阅读全文
posted @ 2013-04-24 10:36 D10.天地弦 阅读(929) | 评论 (0) 编辑
摘要: 今天完成了第三点,初步按照netty 的做法制作了Decoder,由于我现在用的2007还没有泛型,所有我使用的返回TObject做法我先介绍下netty的处理数据的流程1.IOCP接收的数据。2.写入到套接字对应的缓存。3.调用Decoder,进行解码。4.如果解码成功调用套接字对应的数据处理方法。第一步和第二步我把他归纳到IOCP的底层通信要完成的功能。第三步在这里需要和客户端定义协议。和数据打包和拆包的格式。第四步处理具体的业务逻辑。下面我一一贴出代码第一步由IOCP完成。第二步if PerIoData.IO_TYPE = IO_TYPE_Recv thenbegin ...阅读全文
posted @ 2013-04-23 11:28 D10.天地弦 阅读(1775) | 评论 (0) 编辑
摘要: 规划下将要出炉的IOCP。1.将接收IO数据改成内存池。2.扩展lpCompletionKey: DWORD参数.扩展套接字对象。3.借鉴java netty思路,使用decode –> handler的思路来处理客户端数据。//内存池unit uMemPool;interfaceuses JwaWinsock2, Windows, SyncObjs;const MAX_BUFFER_SIZE = 1024;type LPPER_IO_OPERATION_DATA = ^PER_IO_OPERATION_DATA; PER_IO_OPERATION_DATA = packed reco.阅读全文
posted @ 2013-04-22 14:27 D10.天地弦 阅读(2397) | 评论 (12) 编辑
摘要: 现在IOCP可以接收到数据了。>>>>>>>>>其实IOCP的队列是先进先出的,经过测试,看来是我记错了!!!!>>>>2013年4月20日 16:22:46>>>>>引用TCP数据粘包的产生原因在于TCP是一种流协议。在以太网中一个TCP的数据包长度是1500位。其中20位的IP包头,20位的TCP包头,其余的1460都是我们可以发送的数据>>>>>><http://fxh7622.blog.51cto.com/63841/15578>我阅读全文
posted @ 2013-04-20 10:38 D10.天地弦 阅读(1558) | 评论 (0) 编辑
摘要: 今天把前几天研究的代码都整理了下。我觉得刚开始学习IOCP,看简单的例子更容易入门。先截取运行图下面是这个是IOCP简单测试点击运行服务,开启IOCP工作线程和监听过程。创建客户端连接是使用的idtcpClient.发送字符,使用idtcpClient向iocp服务发送一个abc字符///中间用了个小工具显示日志提供源码: 360云盘阅读全文
posted @ 2013-04-20 10:17 D10.天地弦 阅读(1426) | 评论 (5) 编辑
摘要: 接第一次代码继续分析uses JwaWinsock2, Windows, SysUtils;const DATA_BUFSIZE = 1024; IO_TYPE_Accept = 1; IO_TYPE_Recv = 2;type //(1):单IO数据结构 LPVOID = Pointer; LPPER_IO_OPERATION_DATA = ^PER_IO_OPERATION_DATA ; PER_IO_OPERATION_DATA = packed record Overlapped: OVERLAPPED; IO_TYPE: Cardinal; Data...阅读全文
posted @ 2013-04-18 09:30 D10.天地弦 阅读(1683) | 评论 (0) 编辑
摘要: 经过研究代码,觉得有几个函数必须要清楚原理。才能理解代码,清楚流程。异步模式:类似form.show();阻塞模式:类似form.showModal();WSAAccept;当客户端有连接请求的时候,WSAAccept函数会新创建一个套接字cSocket。其他的参数可以查看MSDN,和google。需要说明的一点是这个函数不是异步的,是阻塞模式。WSARecv;收取socket的数据这个函数是异步模式,执行后马上返回。数据接收到后,GetQueuedCompletionStatus,会返回GetQueuedCompletionStatus:实现从指定的IOCP请求队列中获取请求。当队列为空时,阅读全文
posted @ 2013-04-17 13:41 D10.天地弦 阅读(2979) | 评论 (0) 编辑
摘要: 之前一直接从事企业管理的软件,接触网络比较少。网络方面的知识也很惨。最近想弄下iocp。网上找了很多资料,大部分是关于c++的。delphi的比较少。看了下,不适合刚接触网络的菜鸟学习!看过fxh的blog,觉得写的容易理解。http://fxh7622.blog.51cto.com/63841/7667基本上按照他的blog代码进行的编写。编译理解iocp的原理。首先我来个通俗的理解步骤。1.服务器创建一个iocp端口服务。2.服务器创建N个工作线程,不停的轮流处理这个端口上面的连接和请求。3.开启iocp的端口服务<绑定监听端口,进行监听>。如果接收到请求,通知iocp工作线程阅读全文
posted @ 2013-04-16 14:51 D10.天地弦 阅读(3732) | 评论 (1) 编辑