gpt4 book ai didi

sockets - 如何同步从 TServerSocket 到 Multi TClientSocket 的发送流

转载 作者:行者123 更新时间:2023-12-03 15:51:37 25 4
gpt4 key购买 nike

是否有一个解决方案可以在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;

我真正需要的是用一个好的表达式替换循环函数,让我可以将任何文件流或任何文本或任何命令传输或发送到多 TClientSocket,但使用 Syncronize 方法,这意味着连接的每个客户端我的服务器应该同时接收我的 TClientServer 正在发送或传输的内容,并且不会丢失其他客户端或等待一一发送给其他客户端......最后,如果这个组件可能的话,我将感谢任何回复的人提出的任何建议,并深表感谢。

最佳答案

如果您想将同一条数据发送给多个客户端,则无法避免循环。 TCP 根本没有向多个客户端广播数据的概念,因此您必须在代码中手动实现它。这通常意味着为每个客户端制作单独的数据副本,以便他们可以并行发送数据。

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

  1. 将服务器置于线程阻塞模式,以便每个客户端在其自己的专用工作线程中运行。用关键部分包装数据缓冲区。当您想要将数据写入特定客户端时,锁定客户端的缓冲区,将数据追加到缓冲区的末尾,然后解锁。让客户端的工作线程不断检查缓冲区中是否有新数据,并通过客户端的套接字发送它。删除缓冲区前面发送的字节。

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

关于sockets - 如何同步从 TServerSocket 到 Multi TClientSocket 的发送流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41470369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com