按照《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.
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.
你的所谓的公网服务器的IP是多少? 是192.168.xx.xxx的还是 其他的.确定你连接到地址是服务的地址,而不是路由器的。
ping 此ip 通不通?
telnet 此ip x 能建立连接吗?