Envoyer des chaînes unicode sur le réseau

Introduction

Depuis longtemps (la sortie de Delphi 2009 en fait) j'ai voulu envoyé des caractères Unicode en réseau car Delphi 2009 est orienté Unicode donc s'était autant allé jusqu'au bout. Mais hélas impossible de trouver sur internet comment faire, ni même dans la documentation officielle. C'est en épluchant les sources que j'ai trouvé des renseignements intéressant et en final comment résoudre ce problème.

Pourquoi ce tutoriel ?

Car étant donné que je n'ai pas su trouver d'aide sur internet, je partage ma solution.

Requis

- Delphi (n'importe quelle version du moment quel est compatible avec les composants Indy 10).
- Les composants Indy en version 10 installé (Site officiel).
- Connaître un peu votre IDE utilisé.

Comment faire ?

1. Créer un nouveau projet.
Je n'explique pas comment faire car cela dépend de votre version de Delphi.
2. Mettez sur la fiche les composants suivant :
- 1 contrôle "TMemo" avec la propriété "Name" à "mmoLog", vider la propriété "Lines" et mettez la propriété "ReadOnly" à "true".
- 1 contrôle "TButton" avec la propriété "Name" à "btnDemarrer" et la propriété "Caption" à "Démarrer le test d'envois de chaîne en Unicode".
- 1 contrôle "TIdTCPClient" avec la propriété "Name" à "idSocCli". Ne configurez pas les autres propriétés, nous le ferons dans le code.
- 1 contrôle "TIdAntiFreeze". Aucune propriété ne doit être configurée. Sert à ne pas figer le programme pendant la transmission de données.
- 1 contrôle "TIdTCPServer" avec la propriété "Name" à "idSocServer". Comme pour avec le contrôle client, ne configurez pas les autres propriétés.

3. Double-cliquez sur le bouton de votre fiche et entrez le code suivant :
==DefaultPort := 5555;==
==Active := true;==

==Host := '127.0.0.1';==
==Port := 5555;==

Connect;

Lines.Add('Client : ' + StringReplace(idSocCli.Socket.ReadLn(TEncoding.Unicode),'|',sLineBreak,[rfReplaceAll * ));

Socket.WriteLn('Hello', TEncoding.Unicode);

Alors voilà je ne compte pas simplement donné des bout de code comme ça donc voici une petite explication.
- "DefaultPort" défini sur quel port le serveur doit écouter pour recevoir des données. Je n'explique pas ce qu'est un port car ce n'est pas
le but de ce tutoriel.
- "Active := true" sert à dire que le serveur va maintenant démarrer l'écoute sur le port choisit précédemment.

- "Host" sert dans le contrôle "IdTCPClient" à définir l'adresse IP du serveur, l'adresse où l'on doit se connecter. 127.0.0.1 = localhost = ordinateur local,
idéal pour les tests.
- "Port" défini le port sur lequel le client doit aller se connecter. Si vous préférez, le port sur lequel le serveur écoute.
- "Connect" est une procédure servant à se connecter au serveur défini via les propriétés précédentes.

- "mmoLog..." va ajouter dans le mémo "Client : LesDonnéesReçuesParLeServeur". Le replace sert à remplacer les "|" par des retour à la ligne car
en fait le contrôle Indy considère le retour à la ligne comme une fin de chaîne.
- "WriteLn('Hello', TEncoding.Unicode)" envoie le texte "hello" au format Unicode. ATTENTION il faut absolument mettre TEncoding.Unicode pour
que les chaînes Unicode passent. C'est ceci que je ne trouvais jamais sur internet ni dans la documentation.

4. Allez dans les événements de la fiche, dans l'événement "FormClose" ajoutez ceci :

Disconnect;

==Active := false;==

Ici pas besoin de beaucoup d'explication, ceci sert simplement à fermer la connexion proprement avant de terminer le programme.
- On déconnecte le client.
- On arrête d'écouter.

5. Dans les événements du contrôle "idSocCli", ajoutez dans l'événement "OnStatus" :

Lines.Add('Client : ' + AStatusText);

Ajoute dans le mémo "Client : Statut de la connexion". Par exemple : "Client : Connexion à 127.0.0.1."

6. Dans les événements du contrôle "idSocServeur", ajoutez dans l'événement "OnConnect" :

Connection.IOHandler.WriteLn('UNICODE' + '|' +

'Anglais : Hello' + '|' +
'Français : Bonjour' +'|' +
'Russe : Привет' + '|' +
'Japonais : こんにちは' + '|' +
'Chinois : 你好' + '|' +
'Arabe : مرحبا' + '|' +
'Grecs : Γεια σας', TEncoding.Unicode);

Pour l'explication je pense que vous n'en aurez pas besoin car j'ai expliquez dans le point 3 mais une petite remarque quand même. AContext c'est pour faire
simple le client concerné (car en fait le serveur en Indy 10 peut gérer plusieurs clients se trouvant alors dans la propriétés "Contexts" qui contient donc tous
les clients).

7. Dans les événements du contrôle "idSocServeur", ajoutez dans l'événement "OnDisconnect" :
try

Contexts.LockList.Remove(AContext);

finally

Contexts.UnlockList;

end;

Explication : Essayer de bloquer la liste des clients et de supprimer le client concerné (qui vient de se déconnecter). Et que ça ait fonctionné ou pas, débloquer
la liste des clients.

8. Dans les événements du contrôle "idSocServeur", ajoutez dans l'événement "OnExecute" :
try
buffer := Trim(AContext.Connection.IOHandler.ReadLn(TEncoding.Unicode));
except

Connection.Disconnect;

Exit;
end;

Lines.Add('Serveur : ' + buffer);

Déclarer aussi la variable buffer de type string (chaîne Unicode).
Essayer de mettre dans la variable buffer, les données reçues du client (encodée en Unicode) et ça ne va pas, quitter la procédure. Après (uniquement si ça a été),
Afficher dans le mémo "Serveur : LesDonnéesReçuesDuClient"

Conclusion

En final l'astuce était tout simplement d'ajouter "TEncoding.Unicode" comme second paramètre du "WriteLn" et comme paramètre du "ReadLn" et c'était tout. Mais introuvable dans la documentation où sur internet.

weight:bold;">constructives.

Bon codage à tous

Adresse d'origine

Ce document intitulé « Envoyer des chaînes unicode sur le réseau » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous