该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. [转]GFS架构分析

    Google文件系统(Google File System,GFS)是构建在廉价的服务器之上的大型分布式系统.它将服务器故障视为正常现象,通过软件的方式自动容错,在保证系统可靠性和可用性的同时,大大减 ...

  2. c++ 11 override final

    C++ 11添加了两个继承控制关键字:override和final. override确保在派生类中声明的重载函数跟基类的虚函数有相同的签名.final阻止类的进一步派生和虚函数的进一步重载

  3. std::bind 详解及参数解析

    // Bind_std_function.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> ...

  4. 【LeetCode】174. Dungeon Game

    Dungeon Game The demons had captured the princess (P) and imprisoned her in the bottom-right corner ...

  5. MYSQL 5.5.32的单机多实例部署

    Centos6.6安装并配置单机多实例的MYSQL数据库 本文介绍安装单机多实例的MYSQL数据库的环境如下: 系统平台环境:Centos6.6 Mysql软件包:Mysql-5.5.32.tar.g ...

  6. 树莓派进阶之路 (023) - Windows下用串行连接控制树莓派(转)

    转载:http://shumeipai.nxez.com/2014/05/04/under-windows-serial-connection-control-raspberry-pi.html 在没 ...

  7. STDIN_FILENO的作用及与stdin 的区别

    1.STDIN_FILENO的作用 STDIN_FILENO属于系统API接口库,其声明为 int 型,是一个打开文件句柄,对应的函数主要包括 open/read/write/close 等系统级调用 ...

  8. kubelet源码分析(version: git tag 1.7.6)

    一.概述 kubelet源码入口:cmd/kubelet/kubelet.go main() cmd/kubelet/app 包中的Run函数: 查看先参数,kubelet.KubeletDeps t ...

  9. 实体格式化转xml

    In the past, I've done the following to control datetime serialization: Ignore the DateTime property ...

  10. 【Struts2】result类型

    Struts2 result类型 1.dispatcher:服务器跳转到页面,通常来处理JSP,默认类型. 2.redirect:重定向到页面. Action: 1 public String red ...