2017-06-28 1 views
1

J'utilise Delphi 10.0 Seattle.Indy UDP envoyer et répondre des chaînes simples

Je voudrais envoyer des requêtes à un serveur UDP et puis lisez la réponse du serveur, qui est une chaîne simple:

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

La longueur de la chaîne de réponse est variable.

Le serveur fonctionne sur un réseau bien ouvert avec une connexion ouverte (vps dédié). Le client n'est pas le même, il est derrière les routeurs et les réseaux sécurisés (non retransmis).

Jusqu'à présent, je ne peux envoyer la demande du client:

(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; 

côté serveur (nous = 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; 

Je don Je ne sais pas si TCP est meilleur et comment l'utiliser.

Android sera impliqué.

+0

Quelle est la question? –

+0

http://s19.postimg.org/5qat163eb/SCRS_751.png – Someone

Répondre

4

Vous n'utilisez pas correctement l'événement TIdUDPServer.OnUDPRead. Vous devez vous débarrasser des appels à ReceiveString(), ils n'appartiennent pas là. Utilisez le paramètre AData à la place, il contient les octets bruts de la requête du client. TIdUDPServer a déjà lu les données du client avant de déclencher le gestionnaire d'événements.

Si vous avez besoin des octets dans un string, vous pouvez utiliser la fonction BytesToString() d'Indy ou la méthode IIdTextEncoding.GetString().

Pour renvoyer une réponse au client, utilisez le paramètre ABinding.

Essayez ceci:

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; 
+0

Parfait c'est ça – Someone