随笔分类 - Delphi-IOCP
摘要:DIOCP自开源以来,得到了很多朋友的测试,并进行了诸多的改进,现在已经运用到了一些具体的项目当中。DIOCP底层运行稳定。昨天做了个ECHO测试,这个连接数并没有达到上限。 11K 连接,1个半小时,没有断线,被T 服务端内存占用稳定 cpu占用也不高
阅读全文
摘要:印象中网络程序都是sendBuffer和recvBuffer来发送数据和接收数据,本次Demo演示如何定义定义一个自己的对象,然后我们按照OO的思想直接进行对象的发送和接收,先上个流程图。下面是客户端发送和接收的测试代码。下面我们来看看详细的设计。第一步(TMyObject):首先我们需要设计一个需要进行传输的对象.type TMyObject = class(TObject) private FDataString:String; FOle:OleVariant; public property DataString:String read FDataString write F...
阅读全文
摘要:经过昨天晚上一折腾把做了一个DIOCP直接传递TADOQuery的Demo,在google上找了一系列的资料。这样服务端可以直接将TADOQuery查询出来的数据直接转换成TStream自己进行传递,到客户端用一个TADOQuery对象还原流就可以了。两种方法导出的数据格式是一样的方法一是将recordset保存成流接口->转成OleVariant ->写入流class function TADOTools.saveToStream2( pvDataSet: TCustomADODataSet): TMemoryStream;var AStream:_Stream; V:OLEVa
阅读全文
摘要:很久没有写DIOCP的Demo了,主要公司的事情太繁琐,工作之余都不想动了,之前承若的群里面朋友们的DEMO,昨天晚上恶补了一下,把对数据库连接池的操作加入到了Demo中,大家可以通过SVN下载到最新的代码和Demo。 好了我带大家看看这次的DEMO,经过群里面朋友们的推荐,这次代码中引用了UntCobblerUniPool连接池代码来完成的本次的DEMO,研究了下代码,里面使用的线程时钟来做死连和多余连接的释放。感谢UntCobblerUniPool作者无私奉献的精神。 先截个图,看看服务端的界面。主要加入了多帐套的连接的配置。配置文件存放在config\dbpool.config,是一个.
阅读全文
摘要:今天群里有个朋友说他们医院项目采用直连数据库,高峰时期sqlserver的连接数达到7000多,于是我准备做个用diocp做个demo,服务端用连接池。白天的时候我在想,并发如果7000个。如果用diocp做三层服务器,连接池应该在100个左右。今天晚上奋斗了一晚上,准备把测试过程中碰到的问题总结一...
阅读全文
摘要:>>>>>>DIOCP讨论群:320641073>>>>>>SVN源码和DEMO下载:https://code.google.com/p/diocp/ 网络带宽有限,对数据进行压缩再进行传送可以有效的利用带宽和提高传输的效率。DIOCP中对数据进行压缩传送,需要修改编码器和解码器,先说说这两个东西的的用法和功能。 举个例子:我们要把一台电脑快递回老家给正在上学的小弟使用,那么老家就是服务端(S),电脑就是我们要发送的对象(O),快递就是TCP传输过程。在这个过程中,发送一个对象(电脑)用到客户端的编码器,接收对象(电脑)用
阅读全文
摘要:经过两天时间的开源,感谢网友提出一些修改意见,特别是在XE中,做了一部分优化。可以在SVN中下载到最新的代码https://code.google.com/p/diocp/今天做了一个操作数据库的演示<这里我拿出我在实际项目中操作数据库的方法,集成在Demo中>操作数据库比较简单,分两部分功能,第一部分打开SQLprocedure TfrmMain.btnOpenSQLClick(Sender: TObject);var lvJSonStream, lvRecvObject:TJsonStream; lvStream:TStream; lvData:AnsiString; l, j
阅读全文
摘要:经过对一段时间对IOCP的学习和研究。对IOCP的流程有了一定的了解。后面对一段时间的IOCP优化和实际项目的使用,在DIOCP中加入了日志文件记录功能,利用api编写了一个客户端通信类,等解决了很多bug,并已使用在公司的项目中,现运行稳定。今天对IOCP退出时资源的释放,做了最后一步研究和优化。为了方便大家学习,我把这个项目命名为DIOCP,上传在google的SVN项目中https://code.google.com/p/diocp/大家可以通过svn下载代码,里面我写了一个Echo的测试Demo,准备后续加入聊天等Demo。特地为DIOCP开设了一个群:320641073,欢迎学习的I
阅读全文
摘要:Delphi-IOCP 共同学习研究群号 320641073iocp的学习和交流。
阅读全文
摘要:经过一段时间的研究和学习,对IOCP的原理和流程都有了一定的了解,测试的Demo结果显示在局域网内轻轻松松处理5000个左右的连接,还是比较稳定的。运行Echo测试几个小时后。服务端内存稳定在60M左右。这两天对原始代码进行了封装,封装成了一套IOCP类。原始的API调用,对于研究和学习IOCP的原理还是比较好的。封装后,如果没有较好的文档,可能比较难理解。1.发送数据流程图2.服务回写数据流程2.IOCP对象中心2.1 TIOCPObject IOCP对象中心,创建IOCP句柄,开启侦听端口。 提供处理数据,接收套接字,投递接收请求,投递发送请求。 2.2 TIOCPClientCon...
阅读全文
摘要:刚刚的测试,服务端上图开了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...
阅读全文
摘要:现在IOCP的功能还剩下服务端数据的返回。还是采用netty的方式。netty返回数据的调用是这样的contenxt.write(<TObject> obj);这样将obj对象发送给客户端。1.将回传的对象进行编码成buffer2.通过socket进行传送.>>>>>>>>>>>>>>下面我贴出回传数据的过程.procedure TClientContext.writeObject(const pvDataObject:TObject);var lvOutBuffer:TBufferLink;beg
阅读全文
摘要:今天完成了第三点,初步按照netty 的做法制作了Decoder,由于我现在用的2007还没有泛型,所有我使用的返回TObject做法我先介绍下netty的处理数据的流程1.IOCP接收的数据。2.写入到套接字对应的缓存。3.调用Decoder,进行解码。4.如果解码成功调用套接字对应的数据处理方法。第一步和第二步我把他归纳到IOCP的底层通信要完成的功能。第三步在这里需要和客户端定义协议。和数据打包和拆包的格式。第四步处理具体的业务逻辑。下面我一一贴出代码第一步由IOCP完成。第二步if PerIoData.IO_TYPE = IO_TYPE_Recv thenbegin ...
阅读全文
摘要:规划下将要出炉的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.
阅读全文
摘要:现在IOCP可以接收到数据了。>>>>>>>>>其实IOCP的队列是先进先出的,经过测试,看来是我记错了!!!!>>>>2013年4月20日 16:22:46>>>>>引用TCP数据粘包的产生原因在于TCP是一种流协议。在以太网中一个TCP的数据包长度是1500位。其中20位的IP包头,20位的TCP包头,其余的1460都是我们可以发送的数据>>>>>><http://fxh7622.blog.51cto.com/63841/15578>我
阅读全文
摘要:今天把前几天研究的代码都整理了下。我觉得刚开始学习IOCP,看简单的例子更容易入门。先截取运行图下面是这个是IOCP简单测试点击运行服务,开启IOCP工作线程和监听过程。创建客户端连接是使用的idtcpClient.发送字符,使用idtcpClient向iocp服务发送一个abc字符///中间用了个小工具显示日志提供源码: 360云盘
阅读全文
摘要:接第一次代码继续分析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...
阅读全文
摘要:经过研究代码,觉得有几个函数必须要清楚原理。才能理解代码,清楚流程。异步模式:类似form.show();阻塞模式:类似form.showModal();WSAAccept;当客户端有连接请求的时候,WSAAccept函数会新创建一个套接字cSocket。其他的参数可以查看MSDN,和google。需要说明的一点是这个函数不是异步的,是阻塞模式。WSARecv;收取socket的数据这个函数是异步模式,执行后马上返回。数据接收到后,GetQueuedCompletionStatus,会返回GetQueuedCompletionStatus:实现从指定的IOCP请求队列中获取请求。当队列为空时,
阅读全文
摘要:之前一直接从事企业管理的软件,接触网络比较少。网络方面的知识也很惨。最近想弄下iocp。网上找了很多资料,大部分是关于c++的。delphi的比较少。看了下,不适合刚接触网络的菜鸟学习!看过fxh的blog,觉得写的容易理解。http://fxh7622.blog.51cto.com/63841/7667基本上按照他的blog代码进行的编写。编译理解iocp的原理。首先我来个通俗的理解步骤。1.服务器创建一个iocp端口服务。2.服务器创建N个工作线程,不停的轮流处理这个端口上面的连接和请求。3.开启iocp的端口服务<绑定监听端口,进行监听>。如果接收到请求,通知iocp工作线程
阅读全文