DIOCP开源项目-DIOCP3直接发送对象,帮你处理粘包问题

简介: 该DEMO演示,如何在客户端与服务端之间直接传递TStream对象,让你专注于处理数据逻辑,可以忽略处理网络传输间粘包的问题。 上面由服务端向所有的客户端推送一个消息TMemoryStream对象(该对象为字符串数据)。

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

image

上面由服务端向所有的客户端推送一个消息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[1], Length(s));

      // 获取所有的在线客户端列表,
      FTcpServer.getOnlineContextList(lvList);


      // 循环推送到所有的客户端去
for i := 0 to lvList.Count-1 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查看完整源码。

目录
相关文章
|
10天前
|
存储 Python
Python网络编程基础(Socket编程)接收和发送数据
【4月更文挑战第9天】在UDP服务器编程中,我们已经创建了一个UDP套接字并绑定了地址和端口。接下来,服务器需要能够接收来自客户端的数据,并能够对这些数据进行处理和响应。下面,我们将详细讲解如何在UDP服务器中接收和发送数据。
|
2月前
|
安全 Java Go
springboot+netty化身Udp服务端,go化身客户端模拟设备实现指令联动
springboot+netty化身Udp服务端,go化身客户端模拟设备实现指令联动
60 0
|
3月前
|
API 数据安全/隐私保护
jrtplib开源库系列之三:jrtplib发送接收数据流程
前面2篇文章主要说明了如何安装jrtplib库,以及对example1进行了说明,这篇文章主要说下jrtplib库数据的收发流程。
70 0
|
10月前
|
网络协议 Java
(服务器&客户端)网络通信是怎么实现的?7000字爆肝----原来java网络编程技术功不可没(多线程,URL,InetAddressm,TCP,UDP)集结
(服务器&客户端)网络通信是怎么实现的?7000字爆肝----原来java网络编程技术功不可没(多线程,URL,InetAddressm,TCP,UDP)集结
139 1
|
12月前
|
网络协议 Linux
Linux网络编程服务端的创建
Linux网络编程服务端的创建
79 0
|
测试技术 数据格式
艾伟_转载:Socket开发探秘--数据封包和拆包
在上篇《Socket开发探秘--基类及公共类的定义 》中介绍过,所有受到的数据包,经过系统的预处理后,都会得到一个PreData的数据实体,该实体包含了协议头、协议内容和所属用户的ID。PreData是定义了一个标准的协议数据格式,包含了协议关键字、协议内容、用户标识的内容。
888 0
twisted服务器端客户端通信(转载填坑)
版权声明:本文可能为博主原创文章,若标明出处可随便转载。 https://blog.
844 0
|
前端开发 应用服务中间件 nginx
十分钟学会websocket原理(即时消息通讯)
一、什么是Websocket?他与http的关系如何? WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算),换句话说,WebSocket支持持久连接(思考:什么是持久连接?) 首先HTTP有1.