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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值