在delphi中进行tcp ip连接时无法读取消息

时间:2012-11-21 02:29:53

标签: delphi sockets tcp delphi-xe2 indy

我有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 在定期间隔之后显示一些杂项或特殊字符,而不是服务器发送的整数值。

请为此提出任何解决方案。

1 个答案:

答案 0 :(得分:3)

我不确定你的问题在哪里,所以,我发布了一个完整的例子来创建一个基本的Indy服务器和客户端应用程序。

首先,我有一个带有IdTCPServer组件和按钮的服务器应用程序。相关属性是:

object Button1: TButton
  Text = 'Listen'
  OnClick = Button1Click
end
object IdTCPServer1: TIdTCPServer
  DefaultPort = 1234
  OnExecute = IdTCPServer1Execute
end

并且服务器上的IdTCPServer.OnExecuteButton.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成功连接并从该服务器获取信息:

telnet connected to my server

现在,我创建了客户端应用程序。

表单上的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;

在运行时它看起来像这样:

client and server running

该项目是使用Delphi XE3在FireMonkey中完成的,但它也应该与VCL一起使用任何支持Indy 10的Delphi版本。