Sockets 如何将发送流从TServerSocket同步到Multi-TClientSocket
在delphi的ScktComp.dcu中,是否有一种使用TServerSocket的解决方案,该解决方案允许我将单文件流或多文件流同步发送到多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
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
事件完成从缓冲区发送任何未发送的数据,同时从缓冲区前端删除已发送的字节感谢尊敬的雷米的回复,并对我的延误表示歉意。。。请留下任何源代码供参考。