我正在写一个Indy聊天应用程序,我想知道服务器组件是否有办法告诉客户端有一个字符串在等待,甚至是客户端有一个像“OnExecute”这样的事件。 这就是我现在所拥有的:
服务器:
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
答案 0 :(得分:1)
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;