问题:我正在寻找的是使用Indy 10中的IdTCPClient使用单独线程接收数据的最典型或最佳实践方法.
背景:下面的代码是为了清楚起见我要删除的实际数据处理部分的示例.线程的想法是接收所有数据(变量大小,标头声明消息长度的其余部分)然后解析它(这就是HandleData过程的作用)并根据命令触发事件处理程序.
TIdIOHandlerSocket由主应用程序传递给线程,主应用程序也在需要时将数据写入套接字.
TScktReceiveThread = class(TThread)
private
{ Private declarations }
procedure HandleData;
protected
procedure Execute; override;
public
FSocket: TIdIOHandlerSocket;
constructor Create(CreateSuspended: boolean);
end;
procedure TScktReceiveThread.Execute;
var
FixedHeader: TBytes;
begin
Assert(FSocket <> nil, 'You must assign the connected socket to the receiving thread');
SetLength(FixedHeader, 2);
while not Terminated do
begin
if not FSocket.Connected then
Suspend
else
begin
FSocket.CheckForDataOnSource(10);
if not FSocket.InputBufferIsEmpty then
begin
FSocket.ReadBytes(FixedHeader, SizeOf(FixedHeader), false);
// Removed the rest of the reading and parsing …Run Code Online (Sandbox Code Playgroud) 我正在使用Delphi 2007和Indy 10; 如果我错过了一些显而易见的东西,我会有点像德尔福的菜鸟道歉
背景:我有一个简单的服务器应用程序,只需在连接到其端口时发送单词"PING".如果收到"PONG"字样,它也会回复.这工作正常,我已经使用netcat/wireshark手动测试了这个.
我正在尝试编写我的客户端以连接到端口,并在收到它时自动响应PING一词.我创建了一个带有手动连接按钮的简单表单.
客户端连接,但它不响应PING这个词.我认为问题在于:
TLog.AddMsg(FConn.IOHandler.ReadLn);
Run Code Online (Sandbox Code Playgroud)
我的调试日志仅报告"DEBUG:TReadingThread.Execute - FConn.Connected".
我的客户代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdCustomTransparentProxy, IdSocks, IdBaseComponent,
IdComponent, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack,
IdTCPConnection, IdTCPClient, IdSync;
type
TReadingThread = class(TThread)
protected
FConn: TIdTCPConnection;
procedure Execute; override;
public
constructor Create(AConn: TIdTCPConnection); reintroduce;
end;
TLog = class(TIdSync)
protected
FMsg: String;
procedure DoSynchronize; override;
public
constructor Create(const AMsg: String);
class procedure AddMsg(const AMsg: String);
end;
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
IdIOHandlerStack1: …Run Code Online (Sandbox Code Playgroud)