我正在使用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将参与其中。
答案 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;