天天看點

Delphi UPD通訊示範

服務端:

1.  定義結構

type

  TMyRecord = record

    Ip: array[0..16] of Char;

    Port: Integer;

    Data: array[0..1023] of Char;

  end;

2. 窗體建立的時候設定IP,端口

procedure TfrmServer.FormCreate(Sender: TObject);

begin

  idpsrvr1.Bindings.Add;

  idpsrvr1.Bindings[0].IP := GetLocalIP;

  idpsrvr1.Bindings[0].Port := 8098;

  idpsrvr1.Active := True;

  Caption := Format('Server: [%s:%d]', [idpsrvr1.Bindings[0].IP,

    idpsrvr1.Bindings[0].Port]);

  mmo1.DoubleBuffered := True;

end;

3. 設定TIdUDPServer的OnRead事件。

procedure TfrmServer.idpsrvr1UDPRead(Sender: TObject; AData: TStream;

  ABinding: TIdSocketHandle);

var

  ReceiveData: TMyRecord;

  SendData: TMyRecord;

begin

  ZeroMemory(@ReceiveData, SizeOf(ReceiveData));

  ZeroMemory(@SendData, SizeOf(SendData));

  AData.Read(ReceiveData, SizeOf(ReceiveData));

  StrPLCopy(SendData.Ip, idpsrvr1.Bindings[0].IP, Length(SendData.Ip));

  SendData.Port := idpsrvr1.Bindings[0].Port;

  StrLCopy(SendData.Data, ReceiveData.Data, Length(SendData.Data));

  AddData(Format('IP: %s Port: %d  Data: %s',

    [ReceiveData.Ip, ReceiveData.Port, ReceiveData.Data]));

  idpsrvr1.SendBuffer(ReceiveData.Ip, ReceiveData.Port, ReceiveData,

    SizeOf(ReceiveData));

end;

擷取本機IP位址函數

function GetLocalIP: string; //擷取本機區域網路IP

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

  Result := '';

  WSAStartup($101, GInitData);

  try

    GetHostName(Buffer, SizeOf(Buffer));

    phe := GetHostByName(Buffer);

    if nil <> phe then

    begin

      pptr := PaPInAddr(Phe^.h_addr_list);

      I := 0;

      while nil <> pptr^[I] do

      begin

        Result := StrPas(inet_ntoa(pptr^[I]^));

        Inc(I);

      end;

    end;

  finally

    WSACleanup;

  end;

end;

用戶端:

1. 綁定IP

procedure TfrmClient.btnIpClick(Sender: TObject);

begin

    idpsrvr1.Bindings.Add;

    idpsrvr1.Bindings[0].IP := GetLocalIP;

    idpsrvr1.Bindings[0].Port := StrToInt(cbb1.Text);

    idpsrvr1.Active := True;

    ShowMessage('OK');

end;

2. 發送資料

procedure TfrmClient.btnSendClick(Sender: TObject);

var

  MyRecord: TMyRecord;

  DataStr: string;

begin

  //自己的IP位址

  StrPLCopy(MyRecord.Ip, idpsrvr1.Bindings[0].IP, Length(MyRecord.Ip));

  //自己的端口

  MyRecord.Port := idpsrvr1.Bindings[0].Port;

  DataStr := 'Client: ' + edtMsg.Text;

  StrPLCopy(MyRecord.Data, DataStr, Length(DataStr));

  idpsrvr1.SendBuffer(FServerIp, FServerPort, MyRecord, SizeOf(MyRecord));

  tmr1.Enabled := True;

end;

3. 讀取資料

procedure TfrmClient.idpsrvr1UDPRead(Sender: TObject; AData: TStream;

  ABinding: TIdSocketHandle);

var

  SendData: TMyRecord;

begin

  ZeroMemory(@SendData, SizeOf(SendData));

  AData.Read(SendData, SizeOf(SendData));

  AddData(Format('IP: %s Port:%d  Data: %s',

    [SendData.Ip, SendData.Port, SendData.Data]));

end;

繼續閱讀