我试图通过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
?
答案 0 :(得分:2)
在UDP中,每个发送(Broadcast()
,Send()
,SendBuffer()
等)都会发送不同的数据报。触发的每个数据报都会触发OnUDPRead
事件。 AData
一次包含一个不同数据报的数据。
所以,你有两个选择:
以这种方式格式化数据报(例如将标题放在数据的前面),以便识别它们携带的数据类型。这样,您的OnUDPRead
处理程序可以读取标识符/标头,并知道是将剩余数据放到ChatBoxMsg
还是将其传递给音响系统。
如果您不想(或不能)更改数据报格式,则必须将文本和音频数据报发送到不同的端口。您可以使用单个TIdUDPServer
对象同时侦听多个端口(这是Bindings
集合的用途),在这种情况下ABinding
参数OnUDPServer
} event将告诉您收到了哪个端口AData
。或者,只使用两个单独的TIdUDPServer
对象,每个对象在不同的端口上侦听,并为每个对象分配不同的OnUDPRead
处理程序。