相关疑难解决方法(0)

Indy 10 IdTCPClient使用单独的线程读取数据?

问题:我正在寻找的是使用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)

sockets delphi multithreading indy

5
推荐指数
2
解决办法
1万
查看次数

Delphi:Indy TIdTCPClient读数据

我正在使用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)

delphi multithreading indy

3
推荐指数
1
解决办法
1万
查看次数

标签 统计

delphi ×2

indy ×2

multithreading ×2

sockets ×1