簡體   English   中英

如何將從TServerSocket發送流同步到Multi TClientSocket

[英]how to syncronize sending stream from TServerSocket to Multi TClientSocket

有沒有一個解決方案可以在Delphi的ScktComp.dcu中使用TServerSocket,讓我可以將單個文件流或多個文件流同步到Multi TClientSocket ......? 我在這里有這個代碼:

procedure TFrmMainServer.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var 
   a, ACount: integer;
   MyText: String;
   MyBuffer: pchar;
   MyStream: TMemoryStream; //or TFileStream;
begin
...
...
...
  for a := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
  begin
      ServerSocket1.Socket.Connections[a].SendText(MyText);
      // or 
      //ServerSocket1.Socket.Connections[a].SendStream(Mystream); // for files transfering ....
      // or
      //ServerSocket1.Socket.Connections[a].SendBuf(MyBuffer, ACount);
  end;
end;

我需要的是用一個好的表達式替換循環函數,這個表達式允許我將任何文件流或任何文本或任何命令傳輸或發送到多TClientSocket但是使用Syncronize方法並且意味着與我的服務器連接的每個客戶端都應該收到我的TClientServer同時發送或轉移的內容,而不會丟失其他客戶端或一個接一個地等待發送給其他人...最后,如果可以在這個組件上,我將感謝任何一個回復的建議,是非常感謝。

如果要將同一條數據發送到多個客戶端,則無法避免循環。 TCP根本沒有向多個客戶端廣播數據的概念,因此您必須在代碼中手動實現它。 這通常意味着為每個客戶端單獨復制數據,以便它們可以並行發送數據。

有兩種方法可以解決這個問題,並且都需要使用每個客戶端的出站數據緩沖區。 我喜歡使用TServerSocket.OnClientConnect事件為緩沖區創建TMemoryStream並將其分配給TCustomWinSocket.Data屬性,以便可以輕松跟蹤它。 使用對您的代碼有意義的任何內容。

  1. 將服務器置於線程阻塞模式,以便每個客戶端在其自己的專用工作線程中運行。 用關鍵部分包裝數據緩沖區。 當您想要將數據寫入特定客戶端時,請鎖定客戶端的緩沖區,將數據附加到緩沖區的末尾並解鎖。 讓客戶端的工作線程不斷檢查緩沖區是否有新數據,並通過客戶端的套接字發送。 在你去的時候從緩沖區的前面刪除發送的字節。

  2. 將服務器置於非阻塞模式,因此不使用工作線程或鎖。 當您想要將數據寫入特定客戶端時,請檢查客戶端的緩沖區是否已包含任何未發送的字節。 如果是這樣,只需將新字節附加到緩沖區的末尾並繼續。 否則,盡可能多地將字節發送到客戶端的套接字,如果發送失敗並出現WSAEWOULDBLOCK錯誤,則將任何未發送的字節附加到緩沖區的末尾。 使用TServerSocket.OnClientWrite事件完成從緩沖區發送任何未發送的數據,隨時從緩沖區的前面刪除發送的字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM