Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Indy客户端接收字符串_Delphi_Indy - Fatal编程技术网

Delphi Indy客户端接收字符串

Delphi Indy客户端接收字符串,delphi,indy,Delphi,Indy,我正在编写一个Indy聊天应用程序,我想知道是否有一种方法可以让服务器组件告诉客户端有一个字符串正在等待,或者甚至可以让客户端有一个类似“OneExecute”的事件。 这就是我现在拥有的: 服务器: procedure TServer.ServerExecute(AContext: TIdContext); var sResponse: string; I: Integer; list: Tlist; begin List := Server.Contexts.LockLis

我正在编写一个Indy聊天应用程序,我想知道是否有一种方法可以让服务器组件告诉客户端有一个字符串正在等待,或者甚至可以让客户端有一个类似“OneExecute”的事件。 这就是我现在拥有的:

服务器:

procedure TServer.ServerExecute(AContext: TIdContext);
var
  sResponse: string;
  I: Integer;
  list: Tlist;

begin
  List := Server.Contexts.LockList;
  sResponse:= AContext.Connection.Socket.ReadLn;
    try
    for I := 0 to List.Count-1 do
    begin
      try
        TIdContext(List[I]).Connection.IOHandler.WriteLn(sResponse);
      except
      end;
    end;
  finally
    Server.Contexts.UnlockList;
    end;
end;
客户:

procedure TForm1.Button1Click(Sender: TObject);
var
  sMsg : string;
begin
  Client.Socket.WriteLn(edit1.Text);
  sMsg := Client.Socket.ReadLn;
  Memo1.Lines.Add(sMsg);
end;
问题是当我有2个或更多的客户端运行消息时,由于按钮一次只处理1条消息,所以消息会一直堆积。我想要一种客户端等待消息的方法,当它被触发时,它会处理这些消息,就像它现在在按钮过程下所做的那样。我曾尝试将“readln”部分置于计时器下,但这会导致一些重大问题


我在使用Delphi 2010和Indy 10

我想我在这里找到了一个Indy使用阻塞组件的好例子。您应该将每个客户机放在自己的线程上。最好让客户机在单独的线程中进行读取,这样它就不会阻塞主线程。您也可以使用一个计时器,该计时器调用客户端的
IOHandler.CheckForDataOnSource()
方法,并短暂超时,然后仅在客户端的
IOHandler.InputBuffer
不为空时读取。此外,在服务器代码中,在等待数据时不要锁定
上下文
列表。防止客户端连接/断开连接。首先读取数据,然后只有当你有东西要广播给连接的客户端时才锁定列表。我想我在这里找到了一个很好的例子,Indy使用了阻塞组件。您应该将每个客户机放在自己的线程上。最好让客户机在单独的线程中进行读取,这样它就不会阻塞主线程。您也可以使用一个计时器,该计时器调用客户端的
IOHandler.CheckForDataOnSource()
方法,并短暂超时,然后仅在客户端的
IOHandler.InputBuffer
不为空时读取。此外,在服务器代码中,在等待数据时不要锁定
上下文
列表。防止客户端连接/断开连接。首先读取数据,然后仅当您有要向连接的客户端广播的内容时才锁定列表。
procedure TForm1.Timer1Timer(Sender: TObject);
var
  sMsg : string;
begin
  IdIOHandlerStack1.CheckForDataOnSource(0);

  sMsg := IdIOHandlerStack1.InputBuffer.AsString;
  if not (sMsg = '') then 
  begin
    Memo1.Lines.Add(IdIOHandlerStack1.InputBuffer.AsString);
    IdIOHandlerStack1.InputBuffer.Clear;
  end;
end;