怎样写程序实现两台不在一个局域网但都上了internet的电脑间的通信。(100分)

  • 主题发起人 主题发起人 wufen
  • 开始时间 开始时间
我这里有一个小程序是通过拔号网络在两个不同的城市传数据,现在两边都用了ADSL所以
我想把传送的途径改成通过internet而不是通拔号网。在局域网中我可以用socket实现传
送数据,但我在internet中试时就不行了。各位可以告诉我怎样确定服务端的ip地址吗。
如果哪位试过可以给一点代码吗?谢谢!
 
如果你没有自己固定的IP地址的话好象很困难实现了。
我可以给你推荐一个P2P的联系工具。WORKSLINK 可以实现双机互传。
我的WLK号为80948
下载地址为:http://www.workslink.com
[:D]
 
1、你原来所谓的拨号网络,是不是指的服务器端设置多个MODEM铺,然后客户端通过拨号,
进入远端局域网,数据传输类似局域网?
2、如果是上述情况,你将SOCKET在局域网中的数据传输改到INTERNET上,有几点要注意:
首先局域网中的IP可以是内部地址,因为客户端和服务器端在同一个网段内,通讯是没
问题的,但是广域网则不行,服务器端直接使用内部地址,肯定是不行的,解决方法有
两个:1、为服务器端设置真实IP;2、用PROXY,DELPHI的SOCKET控件好象不支持代理,
不过网上有支持代理的SOCKET封装。
其次防火墙,看你公司的状况应该是有防火墙,防火墙一般情况下,是封掉所有不常用
SOCKET口,只保留一些象80口之类的常用端口,而你自己开发的东西,SOCKET口肯定不
可能占用常用端口,你确认一下,双方的防火墙是否把你的端口开放。
 
谢谢dunezi的回答
我不想借用其他软件,想自己写程序控制,不行吗?
 
只能是一方通知另外一方自己的ip地址,
然后主动发起连接,用 socket 聊天对话程序即可,
象QQ则事先有服务器知道每个使用者的ip地址,
所以“二人世界”可以直接连接到对方,而无需主动通知对方或知道对方的ip。

在或者是:象木马程序一样,开一个特殊的端口,连上internet后自动监听,
而客户端则可以在一个网段扫描此端口开放的主机,找到了可连接的主机,就是
你要连接的那台了!
 
谢谢j_shen2000
1.我现在的通信方式就是这样。
2.我们这里现在用的服务器没有真实的ip,只是通过ADSL上网然后通过sygage使客户端也
可以上网。两个城市都是采用这种方式上网的。有可能写程序实现他们间的通信吗。
你说的 “用PROXY,DELPHI的SOCKET控件好象不支持代理, 不过网上有支持代理的
SOCKET封装。”。怎样去实现,可以给点实例实吗?谢谢!
 
采用QQ的方式吧,好像也只有这种方式!
推荐你到
http://www.dev-club.com/club/default.asp
看看循序渐进单元中的相关文章
如何突破网关的种种限制与外界自由通讯(1)--强烈推荐这几篇文章
 
总算知道怎样去实现了,其实只要知道双方上网的动态ip地址就好办了。怎样让客户端知
道服务端的ip那是另一回事。我把获取本机上网的动态ip地址贴出来,以谢大家的热心。
控件代码:
unit OnlineIP;

interface

uses
Windows, Messages, Winsock, Classes, Forms;

type
TOnlineIP = class(TComponent)
private
FEnabled: Boolean;
FDispatchInterval: Cardinal;
FWindowHandle: hWnd;
FOnline: Boolean;
FIP: String;
FOnChanged: TNotifyEvent;

procedure UpdateTimer;
procedure SetEnabled(Value: Boolean);
procedure SetDispatchInterval(Value: Cardinal);
procedure SetNoneBool(Value: Boolean);
procedure SetNoneStr(Value: String);
procedure WndProc(var Msg: TMessage);
protected
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Enabled: Boolean read FEnabled write SetEnabled;
property DispatchInterval: Cardinal read FDispatchInterval write SetDispatchInterval;
property Online: Boolean read FOnline write SetNoneBool;
property IP: String read FIP write SetNoneStr;
property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;
end;

procedure Register;

implementation

function LocalIP: String;
type
TaPInAddr = Array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
Buffer: Array[0..63] of Char;
I: Integer;
GInitData: TWSAData;
begin
WSAStartup($101, GInitData);
Result := '';
GetHostName(Buffer, SizeOf(Buffer));
phe := GetHostByName(buffer);
if phe = nil then Exit;
pPtr := PaPInAddr(phe^.h_addr_list);
I := 0;
while pPtr^ <> nil do
begin
Result := inet_ntoa(pptr^^);
Inc(I);
end;
WSACleanup;
end;

constructor TOnlineIP.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEnabled := True;
FDispatchInterval := 1000;
FWindowHandle := AllocateHWnd(WndProc);
UpdateTimer;
end;

destructor TOnlineIP.Destroy;
begin
FEnabled := False;
UpdateTimer;
DeallocateHWnd(FWindowHandle);
inherited Destroy;
end;

procedure TOnlineIP.WndProc(var Msg: TMessage);
var
OldState: Boolean;
begin
with Msg do
if Msg = wm_Timer then
try
FIP := LocalIP;
OldState := FOnline;
FOnline := (FIP <> '') and (FIP <> '127.0.0.1');
if (not OldState and FOnline) or
(OldState and not FOnline) then
if Assigned(FOnChanged) then FOnChanged(Self);
except
Application.HandleException(Self);
end
else
Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;

procedure TOnlineIP.UpdateTimer;
begin
KillTimer(FWindowHandle, 1);
if (FDispatchInterval <> 0) and FEnabled then
SetTimer(FWindowHandle, 1, FDispatchInterval, nil);
end;

procedure TOnlineIP.SetEnabled(Value: Boolean);
begin
if Value <> FEnabled then
begin
FEnabled := Value;
UpdateTimer;
end;
end;

procedure TOnlineIP.SetDispatchInterval(Value: Cardinal);
begin
if Value <> FDispatchInterval then
begin
FDispatchInterval := Value;
UpdateTimer;
end;
end;

procedure TOnlineIP.SetNoneBool(Value: Boolean); begin {} end;

procedure TOnlineIP.SetNoneStr(Value: String); begin {} end;

procedure Register;
begin
RegisterComponents('Xacker', [TOnlineIP]);
end;

end.

实例代码:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, OnlineIP;

type
TForm1 = class(TForm)
Label1: TLabel;
GroupBox1: TGroupBox;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
OnlineIP1: TOnlineIP;
procedure OnlineIP1Changed(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.OnlineIP1Changed(Sender: TObject);
begin
if OnlineIP1.Online then
begin
Label3.Font.Color := clGreen;
Label3.Caption := 'Online';
Label4.Caption := 'IP: ' + OnlineIP1.IP;
end
else
begin
Label3.Font.Color := clMaroon;
Label3.Caption := 'Offline';
Label4.Caption := '';
end;
end;

end.

 
后退
顶部