我有exe,这是我在我的本地机器上运行(127.0.0.1)。这个exe在端口1234写入并在5678读取.exe每隔50秒写一个整数值表示1212,4545.6767等。我想读取该整数值并显示。所以我使用Indy Client来达到目的。我为此开发了以下代码片段。
IdTCPClient1.Port := 1234; //Set port to connect to
IdTCPClient1.Host := '127.0.0.1'; //Set host to connect to
IdTCPClient1.Connect; //Make connection
sMsg := IdTCPClient1.Socket.ReadLn; //Read the response from the server
ShowMessage(sMsg);
但它没有阅读。在调试时它被卡在线上(sMsg:= IdTCPClient1.Socket.ReadLn;)
当我尝试使用这样的telnet命令时这样做 telnet 127.0.0.1 1234 在定期间隔之后显示一些杂项或特殊字符,而不是服务器发送的整数值。
请为此提出任何解决方案。
答案 0 :(得分:3)
我不确定你的问题在哪里,所以,我发布了一个完整的例子来创建一个基本的Indy服务器和客户端应用程序。
首先,我有一个带有IdTCPServer
组件和按钮的服务器应用程序。相关属性是:
object Button1: TButton
Text = 'Listen'
OnClick = Button1Click
end
object IdTCPServer1: TIdTCPServer
DefaultPort = 1234
OnExecute = IdTCPServer1Execute
end
并且服务器上的IdTCPServer.OnExecute
和Button.OnClick
方法如下所示:
procedure TServerForm.Button1Click(Sender: TObject);
begin
IdTCPServer1.Active := not IdTCPServer1.Active;
if IdTCPServer1.Active then
Button1.Text := 'Close'
else
Button1.Text := 'Listen';
end;
procedure TServerForm.IdTCPServer1Execute(AContext: TIdContext);
var
Num: Integer;
begin
while (IdTCPServer1.Active) and (AContext.Connection.Connected) do
begin
Num := Random(MaxInt);
AContext.Connection.IOHandler.WriteLn(IntToStr(Num));
Sleep(1000);
end;
end;
正如您所看到的,对于每个连接的客户端,我们将进入一个循环,其中每秒将一个随机数(作为字符串)写入套接字。
我执行服务器并按下按钮开始监听,接受防火墙警告以允许端口打开,然后我可以通过telnet成功连接并从该服务器获取信息:
现在,我创建了客户端应用程序。
表单上的Button,Memo和IdTCPClient,相关属性为:
object Button1: TButton
Text = 'Connect'
OnClick = Button1Click
end
object Memo1: TMemo
end
object IdTCPClient1: TIdTCPClient
Host = 'localhost'
Port = 1234
end
,代码如下:
procedure TClientForm.ReadResults;
var
S: string;
begin
while IdTCPClient1.Connected do
begin
S := IdTCPClient1.IOHandler.ReadLn;
Memo1.Lines.Add(S);
//don't repeat this approach in production code, it's just a test here
Application.ProcessMessages;
end;
end;
procedure TClientForm.Button1Click(Sender: TObject);
begin
if IdTCPClient1.Connected then
begin
IdTCPClient1.Disconnect;
Button1.Text := 'Connect';
end
else
begin
IdTCPClient1.Connect;
Button1.Text := 'Disconnect';
Button1.Repaint;
ReadResults;
end;
end;
在运行时它看起来像这样:
该项目是使用Delphi XE3在FireMonkey中完成的,但它也应该与VCL一起使用任何支持Indy 10的Delphi版本。