- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 IdTelnet (indy 10.1) 时遇到问题。我无法以 Unicode 模式从服务器读取数据。现在我想用 IdTCPClient 编写 telnet 终端。
服务器有时会发送一行,有时会发送越来越多的行。但发送之间没有固定的时间。
现在我的问题是,当我必须从 InBuffer 读取数据时。
或者当我必须使用ReadLn函数从服务器读取数据时,我必须运行ReadLn多少次?
最佳答案
TIdTelnet
是一个多线程组件。它有一个内部线程,可以连续从套接字读取数据,只要数据缓冲区可用,就会触发 TIdTelnet.OnDataAvailable
事件。
TIdTelnet
是 TIdTCPClient
后代。查看 IdTelnet.pas 源文件以了解它是如何实现的。您可以在自己的代码中执行类似的操作,在自己的线程中调用 TIdIOHandler.ReadLn()
,例如:
type
TMyThread = class(TThread)
private
FConn: TIdTCPConnection;
protected
procedure Execute; override;
public
constructor Create(AConn: TIdTCPConnection); reintroduce;
end;
constructor TMyThread.Create(AConn: TIdTCPConnection);
begin
inherited Create(False);
FConn := AConn;
end;
procedure TMyThread.Execute;
var
S: String;
begin
while not Terminated do
begin
S := FConn.IOHandler.ReadLn(...);
...
end;
end;
var
Thread: TMyThread = nil;
procedure TForm1.ConnectButtonClick(Sender: TObject);
begin
IdTCPClient1.Connect;
try
Thread := TMyThread.Create(IdTCPClient1);
except
IdTCPClient1.Disconnect;
raise;
end;
end;
procedure TForm1.DisconnectButtonClick(Sender: TObject);
begin
if Assigned(Thread) then Thread.Terminate;
try
IdTCPClient1.Disconnect;
finally
if Assigned(Thread) then
begin
Thread.WaitFor;
FreeAndNil(Thread);
end;
end;
end;
如果你不想使用线程,那么你可以使用计时器。为了确保您的计时器线程(例如主线程)不会被不必要地阻塞,请在 TIdIOHandler.InputBuffer
出现时使用具有较小超时的 TIdIOHandler.CheckForDataOnSource()
方法。空,然后仅在数据可用时调用 TIdIOHandler.ReadLn()
,例如:
procedure TForm1.ConnectButtonClick(Sender: TObject);
begin
IdTCPClient1.Connect;
ReadTimer.Enabled := True;
end;
procedure TForm1.DisconnectButtonClick(Sender: TObject);
begin
ReadTimer.Enabled := False;
IdTCPClient1.Disconnect;
end;
procedure TForm1.ReadTimerElapsed(Sender: TObject);
var
S: String;
begin
if IdTCPClient1.IOHandler.InputBufferIsEmpty then
begin
IdTCPClient1.IOHandler.CheckForDataOnSource(10);
if IdTCPClient1.IOHandler.InputBufferIsEmpty then Exit;
end;
S := IdTCPClient1.IOHandler.ReadLn(...);
...
end;
关于delphi - 如何使用 IdTCPClient 等待来自服务器的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7989133/
我在使用 IdTelnet (indy 10.1) 时遇到问题。我无法以 Unicode 模式从服务器读取数据。现在我想用 IdTCPClient 编写 telnet 终端。 服务器有时会发送一行,有
问题:我正在寻找的是在 Indy 10 中使用单独线程通过 IdTCPClient 接收数据的最典型或最佳实践方法。 背景:下面的代码是我尝试对实际数据处理部分执行的操作示例,为了清楚起见,删除了实际
我在构建Indy Server/Clients实时监视系统时遇到了一个重要问题。 我正在使用DELPHI 2010,并且Indy版本是10.5.5 ......... 我的目的是许多客户端PC连续向服
我在使用 idTCPClient 从 telnet 服务器读取缓冲区的以下代码中遇到问题: procedure TForm2.ReadTimerTimer(Sender: TObject); var
我是delphi新手,这是我的第一个项目。这是一些代码: procedure TForm1.Button2Click(Sender: TObject); responseStringFromServe
我在 XE2 中找到了 Remy Lebeau 的 IdTCP 组件的聊天演示,我想玩一下。 (可以找到 here )我想使用这些组件发送图片,最好的方法似乎是使用 TMemoryStream。如果我
我最近开始玩 Indy 10(来自 Delphi XE3)和 TCP 连接。在您的帮助下(特别感谢 Remy Lebeau),我已经可以构建一个简单的服务器应用程序来管理客户端连接(参见此处 Delp
我是一名优秀的程序员,十分优秀!