该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直接发送对象,帮你处理粘包问题的更多相关文章

  1. DIOCP开源项目-DIOCP3的重生和稳定版本发布

    DIOCP3的重生 从开始写DIOCP到现在已经有一年多的时间了,最近两个月以来一直有个想法做个 30 * 24 稳定的企业服务端架构,让程序员专注于逻辑实现就好.虽然DIOCP到现在通讯层已经很稳定 ...

  2. DIOCP开源项目-DIOCP3的LoadRunner11测试报告

    昨天有个多年的群友(B3.Locet)用LoadRunner11对DIOCP3做压力测试,说测试的时候出现了大量的10053,10054的报告.昨天晚上下载了个LoadRunner11, 今天捣鼓了下 ...

  3. DIOCP开源项目-DIOCP3重写笔记-1

    这几天在在重新DIOCP3,基本工作已经初步完成,进入测试阶段,今天加入排队投递,本认为是个很简单的工作,稍微不注意,留了两个坑,调了7,8个小时,刚刚总算找到问题,记录一下, 关于排队投递的流程 这 ...

  4. DIOCP开源项目-DIOCP3 大文件的传输DEMO<断点续传>

    首先该DEMO在StreamCoder上面做的改动,期间导致StreamCoderDEMO经常出现问题,导致大家运行的时候,频频出现问题,表示道歉. 以下是测试的结果,从服务器下载传输了一个3G左右的 ...

  5. DIOCP开源项目-DIOCP3的ECHO测试<贴图>

    星期六开了测试台测试机子.星期天休息,今天早上来接两个图 开了2个客户端,一个qsl的echo client,一个是楠楠的dbiocp回调客户端.建立13240个连接 今天来后,机子很卡,后来发现是楠 ...

  6. DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了

    [概述] 自从上次发布了[DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端]文章后,得到了很多朋友的支持和肯定.这加大了我的开发动力,经过几个晚上的熬夜,终于在昨天 ...

  7. ActiveMQ服务器之间传输对象,项目A发送对象到项目B接收发送对象《二》

    ActiveMQ服务器之间传输对象,项目A发送对象到项目B接收发送对象<一> 上一篇文章写到对象之间传输使用线程方式 ,无法使用监听方式,最近解决了使用监听方式接收对象,本次使用配置文件方 ...

  8. DIOCP开源项目-定义自己要发送的数据结构(MyObject)

    印象中网络程序都是sendBuffer和recvBuffer来发送数据和接收数据,本次Demo演示如何定义定义一个自己的对象,然后我们按照OO的思想直接进行对象的发送和接收,先上个流程图. 下面是客户 ...

  9. 【DIOCP开源项目】实际应用案例

    案例1 DIOCP是Delphi下进行IOCP服务端通讯开发的一个非常好的开源框架,稳定.高效并且使用起来十分简单. 自己两个多月之前因为需要使用Delphi开发一个TCP服务端,当时也是到处爬文,希 ...

随机推荐

  1. 【tp5】表单验证之token

    1.本场景仅介绍复杂一点的ajax请求带上token验证,普通的form提交不讲 2.原理仅个人理解,如有偏差 欢迎各路大神指点:框架tp5.0.18 目前将token放置于 ajax的header头 ...

  2. Go map中一个很重要的特性

    先看一段代码: func main() { m := make(map[int]string) m[1] = "a" m[2] = "b" m[3] = &qu ...

  3. 详解SpringMVC中Controller的方法中参数的工作原理——基于maven

    转自:http://www.tuicool.com/articles/F7byQn 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:ht ...

  4. lua lua_settable

    void lua_settable (lua_State *L, int index); Does the equivalent to t[k] = v, where t is the value a ...

  5. hduoj1073--Online Judge

    做道题,并没有太多的技巧,关键在与对Accepted,presented error 和wa的判断,第一步如果两者完全一样,那么很定是AC了 ,否则如果去掉多余换行,空格,制表后还有不同说明是数据 不 ...

  6. linux达人养成计划学习笔记(四)—— 压缩命令

    一.常见的压缩格式: 二..zip格式压缩 1.压缩文件.文件夹 zip 压缩后文件名(.zip结尾) 压缩文件名zip -r 压缩后文件夹(.zip结尾) 压缩文件 2.解压缩 unzip 压缩文件 ...

  7. Android如何实现TCP和UDP传输

    TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 首先我们来看一下什么是TCP和UDP. 什么是TCP? TCP:Transmission Control Protocol 传输控 ...

  8. Android----Thread+Handler 线程 消息循环(转载)

    近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子. andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图 ...

  9. AndroidStudio升级到2.3版本无法编译的解决方法

    上周五as提示更新,于是为了体验新功能还在编码过程中就迫不及待的点击了更新,公司网很快,十几分钟就下载好,然后一重启就懵逼了,提示是否更改依赖版本到2.3以及升级gradle到3.3,点了确定就一直在 ...

  10. 【C语言】练习1-23

     题目来源:<The C programming language>中的习题  练习1-23: 写一个删除C语言程序中所有的注释语句.要正确处理带引号的字符串与字符常量.在C语言中,注释不 ...