Indy UDP发送和响应简单的字符串

时间:2017-06-28 23:20:27

标签: delphi udp indy delphi-10-seattle

我正在使用Delphi 10.0 Seattle。

我想将请求发送到UDP服务器,然后读取服务器响应,这是一个简单的字符串:

Client side:send('12345')
server side(onread event or whatever):if received string =  ('12345') then 
send ('jhon|zack|randy')
else disconnect;

响应字符串的长度是可变的。

服务器在打开连接的网络上运行(专用vps)。  客户端不一样,它位于路由器和安全网络之后(未转发)。

到目前为止,我只能从客户端发送请求:

(UC = idUDPclient)

procedure TForm1.Button1Click(Sender: TObject);
var
  s:string;
begin
  if uc.Connected =False then
    Uc.Connect;
  uc.Send('12345');
  uc.ReceiveTimeout := 2000;
  s:=uc.ReceiveString() ;
  ShowMessage(s);
  uc.Disconnect
end;

服务器端(us = idUDPserver)

procedure TForm1.usUDPRead(AThread:TIdUDPListenerThread;const AData: TIdBytes;ABinding: TIdSocketHandle);
begin
  ShowMessage(us.ReceiveString());

  if us.ReceiveString() = '12345' then
  begin
    ShowMessage(us.ReceiveString());

    //respond with a string to the client immediately (behind a routers) how ?
  end;

我不知道TCP是否更好,以及如何使用它。

Android将参与其中。

1 个答案:

答案 0 :(得分:6)

您没有正确使用TIdUDPServer.OnUDPRead事件。你需要摆脱对ReceiveString()的调用,它们不属于那里。请改用AData参数,它包含客户端请求的原始字节。 TIdUDPServer已经在触发事件处理程序之前读取了客户端的数据。

如果您需要string中的字节,则可以使用Indy的BytesToString()函数或IIdTextEncoding.GetString()方法。

要将响应发送回客户端,请使用ABinding参数。

试试这个:

procedure TForm1.usUDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
var
  s: string;
begin
  s := BytesToString(AData);
  //ShowMessage(s);
  if s = '12345' then begin
    ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, 'jhon|zack|randy', ABinding.IPVersion);
  end;
end;