begin process at 2013 05 18 17:05:31
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Réseau & Internet

 > Envoyer des chaînes unicode sur le réseau

Envoyer des chaînes unicode sur le réseau


 Information sur le tutoriel

Note :
Aucune note

 Description

Ce tutoriel va présenter comment envoyer des chaînes au format unicode sur le réseau via les composants Indy en version 10 (testé sur Indy 10.5.7). Il n'y a pas de gestionnaire d'erreur juste le minimum pour la transmission sans problème.

Tutorial

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 :
idSocServer.DefaultPort := 5555;
idSocServer.Active := true;

idSocCli.Host := '127.0.0.1';
idSocCli.Port := 5555;
idSocCli.Connect;

mmoLog.Lines.Add('Client : ' + StringReplace(idSocCli.Socket.ReadLn(TEncoding.Unicode),'|',sLineBreak,[rfReplaceAll]));
idSocCli.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 :
idSocCli.Disconnect;
idSocServer.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" :
mmoLog.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" :
AContext.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
idSocServer.Contexts.LockList.Remove(AContext);
finally
idSocServer.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
AContext.Connection.Disconnect;
Exit;
end;

mmoLog.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.

P.S. : Ceci est mon tout premier tutoriel sur internet n'hésitez pas à faire des critiques constructives.

Bon codage à tous

Commentaires

Commentaire de cirec le 18/11/2010 00:00:03 administrateur CS

Salut,
une où deux choses à corriger:

  - ce n'est pas Indy10 qui permet l'Unicode mais bel et bien Delphi et ce depuis la version 2009. TEncoding est une classe de Delphi.

  - Indy n'intègre le support Unicode de Delphi que depuis la version 10.X.X

Donc au final ... il faut au minimum Delphi2009 et Indy10.2 où 10.5  

@++

Commentaire de gta126 le 19/11/2010 20:30:18

Donc si j'ai bien compris, on ne sait pas faire d'unicode avec par exemple Delphi 7 ?? (bien entendu avec les composants ajoutant le support de l'unicode à cette version de Delphi sinon ça na aucun sens de vouloir transmettre de l'unicode)

Commentaire de cirec le 19/11/2010 22:34:48 administrateur CS

non non,
je soulignai juste que pour utiliser l'exemple tel que tu le donnes il faut, au moins, Delphi 2009 et Indy10.

Sinon, il existe effectivement des composants pour gérer l'Unicode sous D7 mais je ne suis pas certain qu'ils soient compatible avec Indy (comme tu le fais dans ce tuto).

Mais on peut envoyer ce qu'on veut dans un buffer via Indy9-10 ... il faut juste en tenir compte à la lecture/réception.

Ex.
sous Delphi 7 la fonction "DrawText" pointe sur "DrawTextA" (A pour AnsiChar)
sous Delphi 2009 la fonction "DrawText" pointe sur "DrawTextW" (W pour WideChar)

Sachant cela, sous D7 j'utiliserai du "WideChar", "PWideChar", "WideString", "PWideString" et DrawTextW pour afficher.

Donc tout n'est pas perdu :) ... faut juste adapter à la version

@++

Commentaire de adrien5 le 02/02/2012 09:50:02

Bonjour à tous,

Je me permets de rebondir sur ce tuto pour vous poser une petite question.

Je développe en D2009 un web service qui utilise les composants soap. Certaines des fonctions du service doivent envoyer des chaînes de caractères (en format utf-8).
Malheureusement, le client qui doit utiliser le service (qui lui est développé en C# et sur lequel je n'ai aucune emprise) reçoit le message suivant :

Message: The text encoding 'iso-8859-1' used in the text message format is not supported.
Parameter name: encoding

A mon avis, ce que j'envoie n'est pas correctement convertit en utf8. J'ai utilisé le format string et widestring et la fonction encodeutf8 mais rien ne fonctionne.

Etant donné que je n'utilise pas vraiment Indy vu que je passe par les composants soap, quelqu'un sait-il ce qui pose problème?

J'ai placé les paramètres [soSendMultiRefObj,soTryAllSchema,soUTF8InHeader,soUTF8EncodeXML] du composant HTTPsoapPascalInvoker à true.

Vu que je ne sais pas de trop ou chercher, toutes les idées sont bonnes.

Merci d'avance

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,468 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales