当前位置: 58彩票app下载 > 关于计算机 > 正文

Delphi获取内外网IP,基于Delphi完结客商端服务端通

时间:2019-11-13 16:40来源:关于计算机
Author:InSun 在开始之前我们需要了解下这个Demo功能是啥 Blog:     From:www.4safer.com 我们可以看到这是两个小project,左边的project有服务端和客户端1,右边的project只有一个客户端2 最近用D

Author:InSun

在开始之前我们需要了解下这个Demo功能是啥

Blog:    

图片 1

From:www.4safer.com

我们可以看到这是两个小project,左边的project有服务端和客户端1,右边的project只有一个客户端2

最近用Delphi写个综合性的软件,对于进程方面的也在研究,将会有文章出示。

效果就是当两个客户端各自分别输入正确的IP地址和PORT端口,然后btconnect连接就可以连接到这个服务端

在编写系统方面,要Delphi实现内外网IP的获取。

然后就可以发送消息,服务端的Memo1可以显示来自客户端发送信息的内容。

关键字:Delphi获取内外网IP

另外服务端也可以发送消息给两个客户端,做到双向传递信息。

图片 2

两个客户端发送信息给服务端:

 以前用VB写过,参见:

图片 3

VB获取计算机名称,内、外网IP

服务端接收消息反馈给客户端:

图片 4

下载地址:html">

做的很粗糙,但是大概功能算是实现了

VB获取计算机名称,内、外网IP,很简单,仅作示例。这些在编大软件时作为装饰。

具体做法:

Author:Minghacker

第一步、

From:

建立一个Project新建From1拖入如下控件TServerSocket,TClientSocket,TMemo2个,Label四个,TEdit两个

添加winsock控件,Inet控件

TButton四个,TStatusBar。然后设置属性,ServerSocket1的Action为True;ServerSocket1的Port为1025

Private Declare Function ReleaseCapture Lib "user32" () As Long none窗体的移动
       Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long,ByVal wParam As Long, lParam As Any) As Long
       Private Const WM_SYSCOMMAND = &H112
       Private Const SC_MOVE = &HF010&
       Private Const HTCAPTION = 2
       Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
       ReleaseCapture
       ret& = SendMessage(Me.hWnd, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0)
End Sub

 

Private Sub Form_Load()
Text1(0).Text = Winsock1.LocalHostName 必须添加winsock控件
Text1(1).Text = Winsock1.LocalIP 必须添加winsock控件
Text1(2).Text = Inet1.OpenURL("Http://www.3322.org/dyndns/getip") 必须添加Inet控件
End Sub

 

 

代码如下:

其中依靠winsock控件,Inet控件

 

内网IP获取:在Delphi6以上的版本中,有一个IdIPWatch控件,它的功能就是检测网络在线状态和获取

unit Unit1;

IP地址。此控件在Indy Misc页面。用IDIPwatch1.LocalIP。当然也可以用Winsock,我们择便捷用。

interface

可以这样写、procedure TForm1.IP1Click(Sender: TObject);
       showmessage(IDIPwatch1.LocalIP)

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

end;
但是showmessage没额外参数,不能改标题,我们换做messagebox也很简单:

type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    ServerSocket1: TServerSocket;
    Memo2: TMemo;
    StatusBar1: TStatusBar;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    btnConnect: TButton;
    btnSent: TButton;
    btnDisconnect: TButton;
    Button1: TButton;
    Memo1: TMemo;
    Label3: TLabel;
    Label4: TLabel;
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure btnConnectClick(Sender: TObject);
    procedure btnDisconnectClick(Sender: TObject);
    procedure btnSentClick(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

procedure TForm1.IP1Click(Sender: TObject);
var
 Wnd:HWND;
begin
  Wnd:=application.Handle;
  messagebox(Wnd,PChar(IDIPwatch1.LocalIP),PChar(InSun),MB_OK);
end;

var
  Form1: TForm1;

外网Ip获取:

implementation

Delphi中用TIdHTTP控件 ,在Indy Clients页面。

{$R *.dfm}

  示例:
       Memo1.Lines.Text   :=   IdHTTP.Get(URL);  

////////////////////////////////////////////////////////////////////////服务端代码////////////////////////////////////////////////////////////////////////////////////////
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'connect';
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  StatusBar1.SimpleText := 'disconnect';
end;

showmessage(IdHTTP1.Get());

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
 Memo1.Lines.Add('悄悄的对你说'+ Socket.ReceiveText);
end;

所以我们的代码是:
procedure TForm1.IP2Click(Sender: TObject);

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin

var
 Wnd:HWND;
begin
  Wnd:=application.Handle;
  messagebox(Wnd,PChar(IdHTTP1.Get();
end;

    for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
    Serversocket1.socket.connections[i].SendText(Memo1.Text);//服务端向客户端发送信息

其实我们用的就是第三方网页获取公网Ip的。

end;

图片 5

////////////////////////////////////////////////////////////////////////客户端代码////////////////////////////////////////////////////////////////////////////////////////
procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText:='连接成功';//状态栏显示状态
end;

我们聪明的用了最简单的网页,而下面的网页是查询式的,势必用到字符串操作,有些复杂,大家可以研究下。

procedure TForm1.btnConnectClick(Sender: TObject);//输入IP和PORT连接
begin
 if not ClientSocket1.Active then
   begin
     ClientSocket1.Host := Edit1.Text;
     ClientSocket1.Port := StrToInt(Edit2.Text);
     ClientSocket1.Open;
     (Sender as TButton).Enabled := false;
      btnDisconnect.Enabled := true;
     end;
end;

procedure TForm1.btnDisconnectClick(Sender: TObject);//断开连接
begin
if ClientSocket1.Active then
   begin
     ClientSocket1.Close;
     btnDisconnect.Enabled := false;
     btnConnect.Enabled := true;
   end;
end;

“刚才baidu了下,关于这个的,问的人倒是挺多,方法好像不是太多,1,找一个外网的机子配合,

procedure TForm1.btnSentClick(Sender: TObject);//连接成功后发送数据给服务端
begin
 if ClientSocket1.Active then
    ClientSocket1.Socket.SendText(Memo2.Text)
end;

得到本机的公网ip,2,通过三方网页获取,我就是用的2,其实很简单,get html代码,通过几个

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);//客户端监听来自服务端的数据
begin
Memo2.Lines.Add(Socket.ReceiveText);
end;

字符串操作函数分析,得到所需信息。废话说完了,直接看代码。”
function pro_result(str:string):string ;//封装了成一个匹配的处理函数
var
i_0,i_1:Integer;
flag:Boolean;
str_1,temp_result:string;
begin
temp_result:=;
while Pos(查询结果,str)<>0 do
begin
i_1:=Pos(</span>,str);
i_0:=Pos(查询结果,str);
temp_result:=temp_result+Copy(str,i_0,i_1-i_0)+#13#10;
Delete(str,1,Pos(</span>,str));
end;
ReplaceString(temp_result, ,,flag);
Result:=temp_result;
end;

end.

procedure TForm1.Button1Click(Sender: TObject);
var
temp,str_1:string;
i:Integer;
begin
Memo1.Text:=IdHTTP1.Get();
temp:=Memo1.Text;
i:=Pos(查询结果,temp);
str_1:=Copy(temp,i,254);
str_2:=pro_result(str_1);
Memo2.Text:=str_2;
end;

 

当然ReplaceString函数要有定义。

第二步、

我们把它们写在一起,我就不用皮肤了,也不写标题了,大家自己发挥。

再新建一个project作为客户端2 建立Form1拖入控件TClientSocket,TMemo,TEdit两个,Label三个,TButton三个,TStatusBar

如图:

代码如下:

图片 6

 

 

unit Unit1;

Blog: From:www.4safer.com 最近用Delphi写个综合性的软件,对于进程方面的也在研究,将会...

interface

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

type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    Memo2: TMemo;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    btnConnect: TButton;
    StatusBar1: TStatusBar;
    btnSent: TButton;
    btnDisconnect: TButton;
    Label3: TLabel;
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure btnConnectClick(Sender: TObject);
    procedure btnDisconnectClick(Sender: TObject);
    procedure btnSentClick(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText:='连接成功';
end;

procedure TForm1.btnConnectClick(Sender: TObject);
begin
 if not ClientSocket1.Active then
   begin
     ClientSocket1.Host := Edit1.Text;
     ClientSocket1.Port := StrToInt(Edit2.Text);
     ClientSocket1.Open;
     (Sender as TButton).Enabled := false;
      btnDisconnect.Enabled := true;
     end;
end;

procedure TForm1.btnDisconnectClick(Sender: TObject);
begin
if ClientSocket1.Active then
   begin
     ClientSocket1.Close;
     btnDisconnect.Enabled := false;
     btnConnect.Enabled := true;
   end;
end;

procedure TForm1.btnSentClick(Sender: TObject);
begin
if ClientSocket1.Active then
    ClientSocket1.Socket.SendText(Memo2.Text)
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Memo2.Lines.Add(Socket.ReceiveText);
end;

end.

 

编辑:关于计算机 本文来源:Delphi获取内外网IP,基于Delphi完结客商端服务端通

关键词: