Indy 10广播和AData

时间:2014-07-15 03:41:40

标签: delphi indy

我试图通过indy udp组件进行文本聊天,这里是服务器和客户端的代码

udp客户:

procedure TForm1.SendClick(Sender: TObject);
begin
sendtocl.Broadcast(usertype.Text, 12000);
usertype.Clear;
end;

onread Server:

procedure TForm1.UDPReceiverUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
var
  AudioDataSize: Integer;
  AudioData : Pointer;
begin
  try
    EnterCriticalSection(Section);
    try
      AudioDataSize := Length(AData);
      if AudioDataSize > 10 then
      begin
        try
          if not Player.Active then
          begin
            Player.Active := True;
            Player.WaitForStart;
          end;
        except
        end;
        if BlockAlign > 1 then Dec(AudioDataSize, AudioDataSize mod BlockAlign);
        AudioData := AudioBuffer.BeginUpdate(AudioDataSize);
        try
          BytesToRaw(AData, AudioData^, AudioDataSize);
        finally
          AudioBuffer.EndUpdate;
        end;
      end else
      begin
        Player.Active := False;
        Player.WaitForStop;
      end;
    finally
      LeaveCriticalSection(Section);
    end;
  except
  end;
begin
chatboxmsg.Lines.Add(BytesToString(AData));
  end;
end;

它的工作正常,但是我有问题,如果我使用udp客户端与其他目的,如发送缓冲区"发送音频" chatboxmsg.line以任何方式显示音频缓冲区的泛洪数据,使服务器读取分开Adata

1 个答案:

答案 0 :(得分:2)

在UDP中,每个发送(Broadcast()Send()SendBuffer()等)都会发送不同的数据报。触发的每个数据报都会触发OnUDPRead事件。 AData一次包含一个不同数据报的数据。

所以,你有两个选择:

  1. 以这种方式格式化数据报(例如将标题放在数据的前面),以便识别它们携带的数据类型。这样,您的OnUDPRead处理程序可以读取标识符/标头,并知道是将剩余数据放到ChatBoxMsg还是将其传递给音响系统。

  2. 如果您不想(或不能)更改数据报格式,则必须将文本和音频数据报发送到不同的端口。您可以使用单个TIdUDPServer对象同时侦听多个端口(这是Bindings集合的用途),在这种情况下ABinding参数OnUDPServer } event将告诉您收到了哪个端口AData。或者,只使用两个单独的TIdUDPServer对象,每个对象在不同的​​端口上侦听,并为每个对象分配不同的OnUDPRead处理程序。