該DEMO演示,如何在客戶端與服務端之間直接傳遞TStream對象,讓你專注於處理數據邏輯,可以忽略處理網絡傳輸間粘包的問題。
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查看完整源碼。