- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否有一个解决方案可以在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
属性,以便它可以轻松追踪。使用对您的代码有意义的任何内容。
将服务器置于线程阻塞模式,以便每个客户端在其自己的专用工作线程中运行。用关键部分包装数据缓冲区。当您想要将数据写入特定客户端时,锁定客户端的缓冲区,将数据追加到缓冲区的末尾,然后解锁。让客户端的工作线程不断检查缓冲区中是否有新数据,并通过客户端的套接字发送它。删除缓冲区前面发送的字节。
将服务器置于非阻塞模式,这样就不会使用工作线程或锁。当您想要将数据写入特定客户端时,请检查客户端的缓冲区中是否已有未发送的字节。如果是这样,只需将新字节附加到缓冲区末尾并继续。否则,将尽可能多的字节发送到客户端的套接字,如果发送因 WSAEWOULDBLOCK
错误而失败,则将所有未发送的字节附加到缓冲区的末尾。使用 TServerSocket.OnClientWrite
事件完成从缓冲区发送任何未发送的数据,同时从缓冲区前面删除已发送的字节。
关于sockets - 如何同步从 TServerSocket 到 Multi TClientSocket 的发送流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41470369/
我是一名优秀的程序员,十分优秀!