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

该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查看完整源码。

转载于:https://www.cnblogs.com/DKSoft/p/3893452.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值