DIOCP开源项目-DIOCP3直接发送对象,帮你处理粘包问题
该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[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查看完整源码。