Indy Dynamic Create Server Client连接错误10061

时间:2013-10-09 22:09:56

标签: delphi sockets indy

我无法动态创建一些INDY通信。我之前没有使用过Indy,我无法正确设置服务器。我收到错误10061.我已经在防火墙上添加了一条规则以允许此应用程序和端口。如果我使用TServerSocket和TClientSocket但它需要使用Indy。

此代码不起作用

procedure TForm3.Button3Click(Sender: TObject);
var
  temp          : TIdSocketHandles;

begin
  fIdTCPServer1 := TIdTCPServer.Create(nil);
  fIdTCPClient1 := TIdTCPClient.Create(nil);
  temp := TIdSocketHandles.Create(fIdTCPServer1);
  temp.Add.IP := 'xxx.xx.xxx.xx';//'localhost'; //gave error when tryingn to use local host
  temp.Add.Port := 20200;

  fIdTCPServer1.Bindings := temp;
  fIdTCPServer1.OnExecute := IdTCPServer1Execute;
  fIdTCPServer1.StartListening();


  fIdTCPClient1.Port := 20200;
  fIdTCPClient1.Host := 'xxx.xx.xxx.xx';//'localhost';
  fIdTCPClient1.Connect;  //error 10061 here

  fIdTCPClient1.IOHandler.WriteLn('Some message');
end;
procedure TForm3.IdTCPServer1Execute(AContext: TIdContext);
var
  inStr : String;

begin
  inStr := AContext.Connection.IOHandler.ReadLn;
  ShowMessage('Server received : ' + inStr);
end;

此代码有效

procedure TForm3.Button1Click(Sender: TObject);
begin
  serverSocket1 := TServerSocket.Create(nil);
  clientSocket1 := TClientSocket.Create(nil);

  serverSocket1.Port := 20200;
  serverSocket1.OnClientRead := ServerSocket1ClientRead;
  serverSocket1.Active := True;


  clientSocket1.Port := 20200;
  clientSocket1.Host := 'localhost';
  clientSocket1.Active := True;
  clientSocket1.Socket.SendText('Some message');
end;

procedure TForm3.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  inStr  : String;
begin
  inStr := Socket.ReceiveText();
  ShowMessage('Server received : ' + inStr);
end;

2 个答案:

答案 0 :(得分:1)

您需要在每个绑定上设置IP地址和port

// Here you're adding a binding and setting only the IP address
temp.Add.IP := 'xxx.xx.xxx.xx';
// Here you're adding another binding and setting only the port
temp.Add.Port := 20200;

这是一种简单的方法:

with fIdTCPServer1.Bindings.Add do
begin 
  IP := '127.0.0.1'; // Use IP address, not host name. Localhost = 127.0.0.1
  Port := 20200;
end;

这是另一种更详细的方法(将IdSocketHandle添加到您的uses子句中):

var
  socketHandle: TIdSocketHandle;
begin
  socketHandle := fIdTCPServer1.Bindings.Add;
  socketHandle.IP := '127.0.0.1';
  socketHandle.Port := 20200;
end; 

另外,要启动它,您只需将Active设置为true,如下所示:

fIdTCPServer1.Active := True;

答案 1 :(得分:0)

您的代码存在一些问题。

  1. 您滥用TIdTCPServer.Bindings,而您没有正确激活服务器。

  2. 您在ShowMessage()事件中调用了OnExecute,但TIdTCPServer是多线程组件(每个连接的客户端都在自己的线程中运行)而ShowMessage()不是线程安全的。

  3. 您的代码中存在潜在的内存泄漏。

  4. 请改为尝试:

    procedure TForm3.Button3Click(Sender: TObject);
    var
      temp : TIdSocketHandle;
    begin
      if fIdTCPServer1 = nil then
      begin
        fIdTCPServer1 := TIdTCPServer.Create(Self);
        temp := fIdTCPServer1.Bindings.Add;
        temp.IP := 'xxx.xx.xxx.xx';//'localhost'; //gave error when tryingn to use local host
        temp.Port := 20200;
        fIdTCPServer1.OnExecute := IdTCPServer1Execute;
        fIdTCPServer1.Active := True;
      end;
    
      if fIdTCPClient1 = nil then
      begin
        fIdTCPClient1 := TIdTCPClient.Create(Self);
        fIdTCPClient1.Port := 20200;
        fIdTCPClient1.Host := 'xxx.xx.xxx.xx';//'localhost';
      end;
    
      fIdTCPClient1.Connect;
      fIdTCPClient1.IOHandler.WriteLn('Some message');
    end;
    
    procedure TForm3.IdTCPServer1Execute(AContext: TIdContext);
    var
      inStr : String;
    begin
      inStr := AContext.Connection.IOHandler.ReadLn;
      Windows.MessageBox(0, PChar(inStr), PChar('Server received'), MB_OK);
    end;