我需要使用TIdTCPServer
和TIdTCPClient
制作的聊天应用程序中进行一个简单的修复。请,没有其他代码,仅用于发送和接收文本。
procedure TServerApp1.Button1Click(Sender: TObject);
var
AContext : TIdContext;
begin
AContext.Connection.Socket.Write(length(newMSG.Text));
AContext.Connection.Socket.Write(newMSG.Text);
end;
答案 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?