【问题标题】:How can I send a broadcast message in Delphi如何在 Delphi 中发送广播消息
【发布时间】:2018-08-19 14:21:11
【问题描述】:

我想在我的局域网中发送广播 UDP 消息,应用程序是客户端/服务器。

我希望更新用户界面,这样任何计算机都会发送消息来更新其他计算机。 我可以使用 UDPServer indy,如何使用? 谢谢

【问题讨论】:

  • 注意 UDP 是不可靠的 - 见en.wikipedia.org/wiki/… - “当一个消息被发送时,它是否会到达它的目的地是未知的;它可能会在途中丢失。没有概念确认、重传或超时。”
  • 我将使用 TCP 客户端套接字连接来代替 UDP,它在线程中侦听服务器消息。心跳协议可用于检测客户端或服务器端断开连接。

标签: delphi broadcast


【解决方案1】:

创建两个应用程序,一个代表发送者,另一个代表接收者。

发件人

在您的表单上放置一个TIdUDPClient 和一个TButton 组件。在按钮的OnClick 处理程序上写:

procedure TfrmUDPClient.BroadcastClick(Sender: TObject);
begin
  UDPClient.Broadcast('Test', 8090);
end;

接收者

在您的表单上删除TIdUDPServer,为其定义相同的端口(8090)并将其添加到OnUDPRead处理程序:

procedure TfrmUDPServer.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
  DataStringStream: TStringStream;
  Msg: String;
begin
  DataStringStream := TStringStream.Create('');
  try
    DataStringStream.CopyFrom(AData, AData.Size);
    Msg := DataStringStream.DataString;
  finally
    DataStringStream.Free;
  end;
  ShowMessage(Msg);
end;

或者,在 Indy 的更高版本中:

procedure TfrmUDPServer.UDPServerUDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
var
  Msg: String;
begin
  try
    {if you actually sent a string encoded in utf-8}
    Msg := TEncoding.UTF8.GetString(AData);
  except
  end;

  ShowMessage(Msg);
end;

要进行测试,请运行这两个应用程序并单击按钮。要使用两个或更多“听众”进行测试,您必须使用另一台机器。也就是说,您不能在同一个 IP 上运行多个侦听器。

【讨论】:

【解决方案2】:

创建一个TIdUDPServerTIdUDPClient 组件。两者都有 Broadcast 方法,应该完全满足您的需求。

【讨论】:

  • 好的,你有这个方法的例子吗?
  • 不,我不知道。我从来没有用过它们。你遇到什么麻烦了?你给它你想要广播的字符串消息,它就会广播它。
猜你喜欢
  • 2011-04-23
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多