首页 > 代码库 > DIOCP开源项目-DIOCP3直接发送对象,帮你处理粘包问题

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