2010-06-02 10 views
0

Comment envoyer une donnée binaire avec des composants Indy? Lequel d'entre eux est le plus approprié pour cette tâche? J'ai essayé d'utiliser TIdTcpClient mais il permet seulement d'envoyer des chaînes.Envoi de données binaires avec Indy via TCP IP, comment?

J'ai trouvé une reponce pour ce problème here mais je ne comprends pas. Il dit à propos de la méthode Write(TIdBytes), mais la réponse n'est pas claire pour moi. Est-ce qu'il voulait dire écrire à une instance de TIdBytes, et comment connecter cette instance avec TIdTcpClient?

Merci pour toute aide.

Répondre

4

La page que vous citez ne reproduit pas très bien les messages. Voici ce que Rémy a vraiment écrit:

SendCmd() est uniquement conçu pour les commandes/paramètres textuels. Vous auriez pour envoyer les données binaires après la sortie de SendCmd(), et le serveur devra lire les données binaires après avoir renvoyé une réponse au client. Pour exemple:

--- client ---

begin 
    IdTCPClient1.SendCmd('DoIt', 200); 
    // send binary data, such as with Write(TStream) or Write(TIdBytes)... 
end; 

Les méthodes Write dont il parlait sont membres de la classe TIdIOHandler. Votre objet TIdTCPConnection a une instance de cette classe dans sa propriété IOHandler, et en effet c'est ce que la fonction SendCmd utilise pour envoyer sa chaîne.

La notation Write(TIdBytes) moyens d'utiliser la méthode Write qui accepte un paramètre TIdBytes pour son entrée.

Si les données binaires sont déjà dans un flux ou un tableau dynamique d'octets, vous pouvez en passer un directement à la méthode Write. Il y a aussi la méthode WriteFile qui enverra un fichier externe entier si vous fournissez le nom du fichier. Si vous utilisez la version du flux, vous avez la possibilité d'inclure automatiquement la longueur du flux.

Si vous n'avez pas vos données dans une de ces structures déjà, vous pouvez écrire les données fragmentaires avec les méthodes Write qui acceptent les types entiers de différentes tailles, ou vous pouvez copier vos données dans un TMemoryStream et passer ensuite cela à Write.

+0

Merci Rob, la page m'a dérouté à cause de son formatage. Merci pour l'aide. – Wodzu

0

Écrire est une méthode (ou quelque chose d'appelé en Delphi) de TCPClient. Voici le code de travail de ce que vous voulez faire: http://delphi.about.com/od/internetintranet/l/aa012004a.htm. Vous devriez vous lever & courant en un rien de temps :)

+0

En fait, c'est * pas * du code de travail. Au moins pas pour Indy 10. 'Write' n'est plus une méthode de' TIdTCPClient'. –

+0

Merci Mike, le problème est que je n'ai pas une telle méthode dans ma version Indy pour le TIdTcpClient ... aussi la documentation pour Indy doest à propos de ces méthodes ... Je crois que cet exemple que vous avez donné est assez ancien et pas à jour. – Wodzu

+0

Je ne voulais pas dire que vous pouviez copier et coller le code, mais personnellement, j'ai trouvé très utile d'écrire mon propre code (C++ Builder 2009). Tant pis. –