按照《Delphi7组件经典分析》上面的IdTCPClient与IdTCPServer例程,编制了发送图像的客户端与接收图像的服务端。在局域网里面测试,使用正常。而在公网上面却不能发送提示“Socket Error #10060连接超时”。通过360流量监控也可以看到,客户端在尝试与正确的服务端的外网地址进行连接,端口也是设定的正确端口。《客户端源代码》
IdTCPClient控件的host属性设置为服务端的外网地址(也就是通过http://www.ip138.com/查到的地址)
Port属性设置为20000
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient,jpeg;type
  TForm1 = class(TForm)
    Image1: TImage;
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    IdTCPClient1: TIdTCPClient;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
with OpenDialog1 do
begin
if Execute then
Image1.Picture.LoadFromFile(OpenDialog1.FileName);
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var Temp:TMemoryStream;
begin
Temp:=TMemoryStream.Create;//创建内存流
Image1.Picture.Graphic.SaveToStream(Temp);//将图像保存到内存流
IdTCPClient1.Connect;
IdTCPClient1.writestream(Temp);
IdTCPClient1.Disconnect;
Temp.Free;
end;end.
《服务端源代码》
IdTCPServer控件的Active属性设置为True,DefaultPort属性设置为20000
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,jpeg, ExtCtrls, IdBaseComponent, IdComponent, IdTCPServer;type
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    Image1: TImage;
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
const
  TempImageFile='c:\test.jpg'; //设置的临时图像文件
  //要跟客户端发送图像文件文件的类型一样,才可以正确接收到
var
  t:TMemoryStream;
begin
t:=TMemoryStream.Create;
AThread.Connection.ReadStream(t,-1,True);//从连接中取得流式数据
t.SaveToFile(TempImageFile);
Image1.Picture.LoadFromFile(TempImageFile);
t.Free;
end;end.

解决方案 »

  1.   


    你的所谓的公网服务器的IP是多少?  是192.168.xx.xxx的还是 其他的.确定你连接到地址是服务的地址,而不是路由器的。
      

  2.   

    外网地址(也就是通过http://www.ip138.com/查到的地址)为什么都不好好看看我说的话。
      

  3.   

    只能排除法慢慢查了,ping一下看看ip是否畅通,然后看看服务器有没有安装有端口控制功能的防火墙?或者20000端口是否开放,还有你的客户端是否通过代理访问服务器等等
      

  4.   

    服务端的ip、端口x
    ping 此ip 通不通?
    telnet 此ip x 能建立连接吗?