回 帖 发 新 帖 刷新版面

主题:Delphi Socket外网通信求助 (:

我是Delphi新手,有很多东西都不懂。这次又碰到个问题,一不小心就找到这个论坛来了,希望知道的朋友指点一二,谢谢!

下面是整段程序复制下来的,在运行过程中,IP地址设为127.0.0.1或192.168.0.10就能完成通信功能,但是我用外网的IP:218.88.218.55(用专门查IP的网查出来的)就是连不上啊,用路由器管理的网页查出来也是这个IP(当然现在这里写的这个IP是假设的),我用127.0.0.1或192.168.0.10能连上,再重新打开用218.88.218.55和218.088.218.055却连不上。

懂一点的朋友指点一下好吗?谢谢!

程序源代码如下:
//-----------------------------

unit filesend;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp, ComCtrls;

type
  TForm1 = class(TForm)
    Label2: TLabel;
    Edit2: TEdit;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    Button3: TButton;
    SaveDialog1: TSaveDialog;
    ServerSocket1: TServerSocket;
    GroupBox1: TGroupBox;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    ClientSocket1: TClientSocket;
    StatusBar1: TStatusBar;
    Edit1: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure RadioButton1Click(Sender: TObject);
    procedure RadioButton2Click(Sender: TObject);
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1Listen(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button2Click(Sender: TObject);
    procedure ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Connecting(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
fname:string;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
opendialog1.Execute;
fname:=opendialog1.FileName;
edit2.Text:=fname;
button3.Enabled :=true;
groupbox1.Enabled :=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

edit2.Clear;
end;


procedure TForm1.Button3Click(Sender: TObject);
var f1,f2:file;savebtn:string;
buf:array[0..1023]of byte;
cnt:integer;
begin
savedialog1.FileName:=opendialog1.FileName;
savedialog1.Execute;
savebtn:=savedialog1.FileName;
assignfile(f1,edit2.Text);
assignfile(f2,savebtn);
reset(f1,1);
rewrite(f2,1);
try
repeat
blockread(f1,buf,sizeof(buf),cnt);
blockwrite(f2,buf,cnt,cnt);
until cnt<sizeof(buf)
finally
closefile(f2);
closefile(f1);
end
end;

procedure TForm1.RadioButton1Click(Sender: TObject);
begin
button2.Enabled :=true;
clientsocket1.Close;
serversocket1.open;
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
var IPstr:string;
begin
button2.Enabled :=true;
serversocket1.Close;
ipstr:=inputbox('请输入服务器IP','','127.0.0.1');
clientsocket1.Address:=ipstr;
clientsocket1.open;

end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
statusbar1.Panels[0].Text:='连接成功!' ;
end;

procedure TForm1.ServerSocket1Listen(Sender: TObject;
  Socket: TCustomWinSocket);
begin
statusbar1.Panels[0].text:='正在连接客户机...';
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
statusbar1.Panels[0].Text:='已断开与客户机的接连...';
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
serversocket1.Close;
clientsocket1.Close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if radiobutton2.Checked then clientsocket1.socket.sendtext(edit1.text);
if radiobutton1.Checked then serversocket1.Socket.Connections[0].SendText(edit1.text);
statusbar1.Panels [1].Text:='本地消息:'+edit1.Text;
begin

end;
edit1.Clear;
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
statusbar1.Panels[0].text:='已断开与服务器的连接...';
end;

procedure TForm1.ClientSocket1Connecting(Sender: TObject;
  Socket: TCustomWinSocket);
begin
statusbar1.Panels[0].text:='正在连接服务器...';
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
statusbar1.Panels[0].text:='连接成功!';
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
statusbar1.Panels [1].Text:='远程消息:'+serversocket1.Socket.Connections[0].ReceiveText;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
statusbar1.Panels [1].Text:='远程消息:'+socket.ReceiveText;
end;

end.

回复列表 (共2个回复)

沙发

是不是外网的计算机上没有服务软件呀,一般这样的系统,两端都要有软件的,否则如何通讯,我还不明白你的意思.我以前的在外网通讯是没问题的.

板凳

程序中Server和Client是在一个程序中的,等于说你是用程序本身进行的内部通信,所以必须是把所设置的IP地址设置为运行程序的机器的IP地址才可以,连接外网时由于Server启动的还是本地的监听,Client却连接外网,所以是不可能连上的。
你还是把Server和Client分开来做会好点。

我来回复

您尚未登录,请登录后再回复。点此登录或注册