首页 > 代码库 > DIOCP开源项目-DIOCP3直接发送对象,帮你处理粘包问题
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查看完整源码。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。