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

Indy UDP sending and responding simple strings

我正在使用 Delphi 10.0 西雅图。

我想向 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会参与

您没有正确使用 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;