如何将文本从Indy TCPServer发送到TCPClient

时间:2018-10-30 17:46:55

标签: delphi indy

我需要使用TIdTCPServerTIdTCPClient制作的聊天应用程序中进行一个简单的修复。请,没有其他代码,仅用于发送和接收文本。

procedure TServerApp1.Button1Click(Sender: TObject);
var
  AContext : TIdContext;
begin
  AContext.Connection.Socket.Write(length(newMSG.Text));
  AContext.Connection.Socket.Write(newMSG.Text);
end;

1 个答案:

答案 0 :(得分:1)

TIdTCPServer具有Contexts属性,其中包含已连接客户端的列表。您将必须锁定并遍历该列表,以查找要发送到的客户端。例如:

procedure TServerApp1.Button1Click(Sender: TObject);
var
  Buf: TIdBytes;
  List: TIdContextList;
  Context: TIdContext;
  I: Integer;
begin
  // this step is important, as Length(newMSG.Text) will not
  // be the actual byte count sent by Write(newMSG.Text)
  // if the text contains any non-ASCII characters in it!
  Buf := ToBytes(newMSG.Text, IndyTextEncoding_UTF8);

  List := IdTCPServer1.Contexts.LockList;
  try
    for I := 0 to List.Count-1 do
    begin
      Context := TIdContext(List[I]);
      if (Context is the one you are interested in) then
      begin
        Context.Connection.IOHandler.Write(Length(Buf));
        Context.Connection.IOHandler.Write(Buf);
        Break;
      end;
    end;
  finally
    IdTCPServer1.Contexts.UnlockList
  end;
end;

但是,我不建议直接向这样的客户端发送消息。这可能会导致竞争状况,从而可能破坏您的通信。一个更安全的选择是为每个客户端提供自己的线程安全队列,您可以在需要时将消息推送到其中,然后可以在安全的情况下让TIdTCPServer.OnExecute事件处理程序发送已排队的消息。有关示例,请参见以下问题的my answer

¿How can I send and recieve strings from tidtcpclient and tidtcpserver and to create a chat?