Sockets 如何将发送流从TServerSocket同步到Multi-TClientSocket

Sockets 如何将发送流从TServerSocket同步到Multi-TClientSocket,sockets,delphi,asynchronous,Sockets,Delphi,Asynchronous,在delphi的ScktComp.dcu中,是否有一种使用TServerSocket的解决方案,该解决方案允许我将单文件流或多文件流同步发送到多TClientSocket。。。? 我这里有这个代码: procedure TFrmMainServer.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); var a, ACount: integer; MyText: String; My

在delphi的ScktComp.dcu中,是否有一种使用TServerSocket的解决方案,该解决方案允许我将单文件流或多文件流同步发送到多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;
我需要的是用一个好的表达式来替换循环函数,该表达式允许我将任何文件流、任何文本或任何命令传输或发送到multi-TClientSocket,但要使用Syncronize方法,这意味着与我的服务器连接的每个客户机都应该同时接收我的TClientServer正在发送或传输的内容在不失去其他客户或等待一个接一个发送给其他客户的情况下。。。
最后,如果这个组件有可能的话,我将非常感谢任何回复的人的建议。如果您想向多个客户端发送相同的数据段,您将无法避免循环。TCP根本没有将数据广播到多个客户端的概念,所以您必须在代码中手动实现它。这通常意味着为每个客户机制作一个单独的数据副本,以便他们可以并行发送数据

有两种方法可以处理此问题,并且都需要使用每客户端出站数据缓冲区。我喜欢使用
TServerSocket.OnClientConnect
事件为缓冲区创建
TMemoryStream
,并将其分配给
TCustomWinSocket.Data
属性,以便轻松跟踪。使用对代码有意义的任何东西

  • 将服务器置于线程阻塞模式,以便每个客户端在其自己的专用工作线程中运行。用临界段包装数据缓冲区。当您想向特定客户机写入数据时,请锁定客户机的缓冲区,将数据附加到缓冲区的末尾,然后解锁它。让客户端的工作线程不断检查缓冲区中的新数据,并通过客户端的套接字发送数据。移动时从缓冲区前端删除发送的字节

  • 将服务器置于非阻塞模式,以便不使用工作线程或锁。当您想向特定客户机写入数据时,请检查客户机的缓冲区中是否已经有未发送的字节。如果是这样,只需将新字节追加到缓冲区的末尾,然后继续。否则,将尽可能多的字节发送到客户端的套接字,如果发送失败并出现
    WSAEWOULDBLOCK
    错误,则将任何未发送的字节追加到缓冲区的末尾。使用
    TServerSocket.OnClientWrite
    事件完成从缓冲区发送任何未发送的数据,同时从缓冲区前端删除已发送的字节


  • 感谢尊敬的雷米的回复,并对我的延误表示歉意。。。请留下任何源代码供参考。