程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> DIOCP開源項目-DIOCP3直接發送對象,幫你處理粘包問題,diocp-diocp3

DIOCP開源項目-DIOCP3直接發送對象,幫你處理粘包問題,diocp-diocp3

編輯:Delphi

DIOCP開源項目-DIOCP3直接發送對象,幫你處理粘包問題,diocp-diocp3


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




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved