2012-03-27 33 views
4

一個非常簡單的問題,我似乎無法找到一個明確的答案。德爾福和TIdTCPServer.OnExecute:如何正確合併數據

我有一個經典的TCP Indy服務器。我以塊的形式發送數據。每個數據包都以一個或多個塊發送。當它到達時,每個數據包都會觸發一次或多次OnExecute。多於一個客戶端可以在任何給定時間發送數據。我如何知道我在OnExecute中接收哪些客戶端/數據包?我知道這可能是一個微不足道的問題,但我想要一個明確的答案。

+0

這種方式的一個例子是在這裏http://www.delphigeist.com/2010/09/custom-client-server-application-with.html,請注意這是一個「急」的工作,你可以改善很多,但這是一個開始。 – ComputerSaysNo 2012-03-27 10:15:18

+0

你爲什麼要以塊的形式發送數據?那正是TCP爲你做的事情?你不應該關心這些低級別的問題。 – jpfollenius 2012-03-27 10:23:35

+0

如果TCP對我這樣做,我有同樣的問題。 OnExecute被觸發多次。另外,如果你正在發送一個非常大的文件。你會只加載它在一塊大塊RAM。不可取。將數據分成可管理的塊總是很好的。 – Runner 2012-03-27 10:25:53

回答

3

如果你可以設計協議,這是可以做到這樣的:

  • 客戶開始與一個初始命令,其中包括總的大小和塊大小
  • 服務器OnExecute創建一個臨時的輸出文件流並存儲在上下文
  • 客戶端發送塊
  • OnExecute讀取塊中的服務器文件信息(使用印TCP服務器阻斷與已知的塊長度的讀取方法)和將它們附加到輸出流

Indy TCP上下文類可以擴展爲客戶端連接添加自定義信息。

+0

啊,這是我失蹤的擴展上下文類。那麼我可以將客戶端ID或數據ID添加到上下文中,這樣我就可以知道在另一邊放回什麼東西。這在我看來並不明顯。 – Runner 2012-03-27 18:47:26

+1

@Runner上下文類僅在服務器端(請參閱TIdCustomTCPServer)。它綁定到客戶端連接(請參閱TIdContext.Connection),並且可以使用TIdCustomTCPServer.ContextClass註冊一個子類:= TMyContextClass; – mjn 2012-03-27 21:08:08

+3

如果你不想派生一個新的類,你也可以使用'TIdContext.Data'屬性。 – 2012-03-27 21:18:04