DIOCP开源项目-DIOCP3直接发送对象,帮你处理粘包问题
该DEMO演示,如何在客户端与服务端之间直接传递TStream对象,让你专注于处理数据逻辑,可以忽略处理网络传输间粘包的问题。

上面由服务端向所有的客户端推送一个消息TMemoryStream对象(该对象为字符串数据)。
代码解释:
procedure TfrmMain.actPushMsgExecute(Sender: TObject);
var
lvList:TList;
i: Integer;
lvStream:TMemoryStream;
s:AnsiString;
begin
lvList := TList.Create;
try
lvStream := TMemoryStream.Create;
try
s := edtMsg.Text;
lvStream.Write(s[], Length(s)); // 获取所有的在线客户端列表,
FTcpServer.getOnlineContextList(lvList); // 循环推送到所有的客户端去
for i := to lvList.Count- do
begin
//直接推送TMemoryStream对象<内部试用编码器将TStream编码成协议格式,然后发送>
TIOCPClientContext(lvList[i]).writeObject(lvStream);
end;
finally
lvStream.Free;
end;
finally
lvList.Free;
end; end;
上面为推送按钮的代码
constructor TfrmMain.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FTcpServer := TIOCPConsole.Create(Self);
FTcpServer.createDataMonitor;
FTcpServer.OnDataObjectReceived := OnRecvObject; // register decoder and encoder class
FTcpServer.registerCoderClass(TIOCPStreamDecoder, TIOCPStreamEncoder);
TFMMonitor.createAsChild(pnlMonitor, FTcpServer);
end;
上面注册编码和解码器,这样可以在接受数据时和发送数据时,处理对象的转换工作,同时赋值了接收对象事件。
onRecvObject,如果解码成功一个对象时,会触发一次事件
procedure TfrmMain.OnRecvObject(pvClientContext: TIocpClientContext;
pvObject: TObject);
begin
pvClientContext.writeObject(pvObject);
end;
//上面代码直接把对象推送回客户端。
客户端代码类似,可以下载socket-coder\StreamCoder查看完整源码。
DIOCP开源项目-DIOCP3直接发送对象,帮你处理粘包问题的更多相关文章
- DIOCP开源项目-DIOCP3的重生和稳定版本发布
DIOCP3的重生 从开始写DIOCP到现在已经有一年多的时间了,最近两个月以来一直有个想法做个 30 * 24 稳定的企业服务端架构,让程序员专注于逻辑实现就好.虽然DIOCP到现在通讯层已经很稳定 ...
- DIOCP开源项目-DIOCP3的LoadRunner11测试报告
昨天有个多年的群友(B3.Locet)用LoadRunner11对DIOCP3做压力测试,说测试的时候出现了大量的10053,10054的报告.昨天晚上下载了个LoadRunner11, 今天捣鼓了下 ...
- DIOCP开源项目-DIOCP3重写笔记-1
这几天在在重新DIOCP3,基本工作已经初步完成,进入测试阶段,今天加入排队投递,本认为是个很简单的工作,稍微不注意,留了两个坑,调了7,8个小时,刚刚总算找到问题,记录一下, 关于排队投递的流程 这 ...
- DIOCP开源项目-DIOCP3 大文件的传输DEMO<断点续传>
首先该DEMO在StreamCoder上面做的改动,期间导致StreamCoderDEMO经常出现问题,导致大家运行的时候,频频出现问题,表示道歉. 以下是测试的结果,从服务器下载传输了一个3G左右的 ...
- DIOCP开源项目-DIOCP3的ECHO测试<贴图>
星期六开了测试台测试机子.星期天休息,今天早上来接两个图 开了2个客户端,一个qsl的echo client,一个是楠楠的dbiocp回调客户端.建立13240个连接 今天来后,机子很卡,后来发现是楠 ...
- DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了
[概述] 自从上次发布了[DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端]文章后,得到了很多朋友的支持和肯定.这加大了我的开发动力,经过几个晚上的熬夜,终于在昨天 ...
- ActiveMQ服务器之间传输对象,项目A发送对象到项目B接收发送对象《二》
ActiveMQ服务器之间传输对象,项目A发送对象到项目B接收发送对象<一> 上一篇文章写到对象之间传输使用线程方式 ,无法使用监听方式,最近解决了使用监听方式接收对象,本次使用配置文件方 ...
- DIOCP开源项目-定义自己要发送的数据结构(MyObject)
印象中网络程序都是sendBuffer和recvBuffer来发送数据和接收数据,本次Demo演示如何定义定义一个自己的对象,然后我们按照OO的思想直接进行对象的发送和接收,先上个流程图. 下面是客户 ...
- 【DIOCP开源项目】实际应用案例
案例1 DIOCP是Delphi下进行IOCP服务端通讯开发的一个非常好的开源框架,稳定.高效并且使用起来十分简单. 自己两个多月之前因为需要使用Delphi开发一个TCP服务端,当时也是到处爬文,希 ...
随机推荐
- ios中地图定位
#import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> @interface ViewController ...
- webpack window 添加第三方库
有的时候还想来点jquery,moment,undersocre之类的库,webpack可以非常容易的做到这一点,有谣言说Bower即将停止开发了, 作者推荐都使用npm来管理依赖.那么我们现在安装在 ...
- React(0.13) hello world
<!DOCTYPE html> <html> <head> <title>React JS</title> <script src=& ...
- php如何在某个时间上加一天?一小时? 时间加减(转)
<?php date_default_timezone_set('PRC'); //默认时区 echo "今天:",date("Y-m-d",time() ...
- 【java】详解java中的注解(Annotation)
目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...
- 在windows下安装Jupyter Notebook的安装和使用
1 认识jupyter jupyter /ˈdʒuːpɪtə(r)/可以提供适合捕捉整个计算过程的基于web的应用程序:开发.记录和执行代码,以及结果输出. jupyter Notebook提供了两个 ...
- css浮动中避免包含元素高度为0的4种解决方法
问题:当子元素中使用了float时,如果其父元素不指定高度,其高度将为0 解决:清除(闭合)浮动元素,使其父div高度自适应 方法一:额外标签+clear:both (W3C推荐方法,兼容性较 ...
- threaded_execution
Property Description Parameter type Boolean Default value false Modifiable No Range of values true | ...
- Ubuntu 13..04 开机后桌面问题引发的一系列问题
早上开机的时候,发现只能见到桌面,没有顶部的菜单栏,没有侧边栏(Unity桌面),不能使用快捷键(不能调出终端),貌似只能用 Ctrl Alt F1-7和关机快捷键.对于我这个刚使用Ubuntu不久的 ...
- Android 获取自带浏览器上网记录
先是搜索了一下,在manifest里添加 <uses-permission android:name="com.android.browser.permission.READ_HIST ...