一个非常简单的 Delphi 12
TIdTCPClient
/TIdTCPServer
Windows 应用程序,在 OpenVPN 下,当服务器应用程序构建并在调试模式下运行时,工作正常,而当服务器应用程序构建并运行时,不工作在释放模式下(出现“连接超时”错误消息)。
服务器侦听开放端口,客户端向服务器 VPN 套接字(公共 VPN IP 和侦听端口)发送字符串消息。
这是服务器端和客户端的部分代码:
服务器端
procedure TFormServer.IdTCPServer1Execute(AContext: TIdContext);
Begin
var StrMsgCli := AContext.Connection.IOHandler.ReadLn(IndyTextEncoding_UTF8);
MemoMsgClient.Text:= StrMsgCli;
End;
客户端
procedure TFormClient.SpeedButtonSendToServerClick(Sender: TObject);
Begin
var StringToSend:= 'BlaBlaBla_123';
IdTCPClient1.Connect;
IdTCPClient1.IOHandler.WriteLn(StringToSend);
End;
有人可以解决这个问题吗?
TIdTCPServer
是一个多线程组件。它的大多数事件(包括 OnExecute
)在工作线程中调用,而不是在主 UI 线程中调用。因此,直接访问 UI 控件(就像使用 MemoMsgClient
一样)不是线程安全的,并且必须与主 UI 线程同步,例如使用 TThread.Synchronize()
或 TThread.Queue()
,例如:
procedure TFormServer.IdTCPServer1Execute(AContext: TIdContext);
Begin
var StrMsgCli := AContext.Connection.IOHandler.ReadLn(IndyTextEncoding_UTF8);
TThread.Queue(nil,
procedure
begin
MemoMsgClient.Text := StrMsgCli;
end
);
End;