Fichiers pesant 0 ko après transfert ftp

Résolu
Skanenruf Messages postés 38 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 30 juin 2010 - 28 juin 2010 à 16:27
nvoisn Messages postés 26 Date d'inscription lundi 23 janvier 2012 Statut Membre Dernière intervention 29 septembre 2014 - 26 août 2011 à 09:16
Bonjour à tous,

Je suis en train de travailler sur une application en VB.NET (le possède Visual Studio 9, VB.NET 2008 Express). Cette application repose sur quelques fonctions : les transferts FTP. J'ai besoin de me connecter à un serveur FTP, d'y downloader et uploader des fichiers.

Comme les fonctions implémentées dans le framework ne marchaient pas, j'ai cherché dans les applications de vbfrance et j'ai trouvé un très bon code : http://www.vbfrance.com/codes/TRANSFERT-FICHIER-FTP-AVEC-VB-NET_5664.aspx

Je me suis lancé dans la programmation de mon application. Ça marche très bien chez moi mais dès que je l'envoie à un ami (sous Windows comme moi) pour la tester les fonctions upload et download vident les fichiers. Chez lui les fichiers sont bien envoyés sur le FTP (dans le cas d'un upload) ou sur son ordinateur (dans le cas d'un download) mais ils sont complètement vides (je transfère des fichiers .txt et .ini).

Je tiens à préciser que j'utilise un serveur FTP chez un hébergeur (je ne l'héberge pas moi même). Mon hébergeur est olympe-network.

Je suis complètement bloqué dans l'avancement de mon programme.

Pouvez-vous m'aider ?
Merci beaucoup d'avance.
Léo.
A voir également:

19 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 juin 2010 à 16:56
Salut
Après transfert, attends-tu qu'il soit bien terminé avant de clore la connexion ?
Où vois-tu "0 octets" ?
As-tu fais un Refresh du Buffer = une relecture ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
28 juin 2010 à 17:48
Salut,

Si ton appli fonctionne sur ton pc et pas sur un autre, alors le problème vient forcément du changement d'environnement. Tu dois avoir une ligne de code non géré dans un Try/Catch non notifié.

Regarde aussi que tous les composants COM éventuels soit présents et enregistrés dans le registre de la machine sur laquelle tu teste ton appli.

Dans le pire des cas, poste le code te permettant de télécharger le "dit" fichier, on pourra peut être décelé une erreur à laquelle tu n'as pas pensé.

Si le fichier existe, c'est qu'il est créé par le FileStream, mais que l'erreur stop le reste du code, c-à-d la copie des bytes du fichier sur le serveur dans ce même fichier. Je pense donc que l'authentification et les paramètres FTP sont corrects, mais tant que je n'ai pas vu ton code je ne peux le certifier.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
3
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
28 juin 2010 à 19:15
Ah, OK!

Bien heu... comment te dire, en fait le FTP sert au transfert de fichiers et tu te casses vraiement la tête pour rien à essayer de te servir de ce protocole pour une application de communication, c'est pas du tout fais pour, ce serait comme planter un clou avec une fourchette, tu y arriverais peut être au bout de nombreuses heures, mais moi j'aurais eu le temps d'en planter 100 avec mon marteau.

Il y a de multiples exemples d'application client/serveur sur ce site, chaque nouveau développeur veut soit créer un chat, soit un bloque note, une calculette, une appli de base de données ou un navigateur, c'est pour te dire que les exemples ne manques pas.

Je te conseil plutôt d'abandonner au profit des sockets (espace de noms "System.Net.Sockets"), qui permet la communication entre deux applis, tu peux aussi rechercher une source nomé b@z socket de BABBOSS, (mot clé : baz socket).

Bien entendu si tu me dis que tu te sert du FTP pour éviter l'ouverture des ports au utilisateurs, je te répondrais qu'il existe de nombreuses solutions pour parer à cela, comme l'UPnP, ou bien simplement en passant par un Web Service.

Pour ce qui est de ta fonction FTP il ne vaut mieux pas utiliser ces fontions "préfaites" du framework...

Utilise plutôt FtpWebRequest, et FtpWebResponse de System.Net.

Ton code plus haut est fonctionnel, a condition que le répertoire cible existe sur la machine de ton ami, que le fichier source existe également et que le port 21 sortant de son routeur ne soit pas bloqué (à vérifier).


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
3
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
28 juin 2010 à 22:16
Perso, je te le redis le FTP n'est pas du tout adapté pour ce que tu cherches à faire.

1\ Tu devras stocker les mots de passe et identifiant de ton serveur au sein du code, ce qui comporte de gros risques n'importe qui pourra prendre le contrôle de ton serveur, supprimer tes identifiants FTP.

2\Le dialogue par fichier texte est impossible:

- Le client A télécharge le fichier texte et l'ouvre, il affiche alors le dernier message.
- Le client A, écrit alors une réponse et la publie sur le serveur FTP.
- Le client B fait de même.

OK, mais que se passera-t-il si le client A est sur un PC très lent ou occupé, et que celui-ci mette 3 secondes pour envoyer le fichier texte ? Et qu'entre temps le client B ai lui, téléchargé 3 fois le fichier texte et réécrit dedans ? Et bah oui... les messages sont perdus...

De même, que se passe-t-il si le fichier date d'il y a 3 semaine et comporte plus de 50Mo de lignes ? Ton application va télécharger/envoyer 50 Mo à chaque envoi ou réception de message pour seulement quelques octets du message en cours ? Quel gaspillage de BP ! Ton appli mettra alors plusieurs minutes pou ne serait-ce qu'afficher ou envoyer un message !

Tu me diras, mais non, le fichier sera effacé avant, OK, mais par qui un client ? Lequel ? Et quand ? Comment pourras-tu t'assuré que tous les destinataires on bien lu tous les messages avant d'effacer le dit fichier ?

Donc cela ne tien pas la route.

Si tu tiens à passer par un serveur, alors utilise plutôt un service web, c'est plus prévu à cet effet.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
28 juin 2010 à 23:31
J'ai bien compris que c'est une application perso et que ce ne sera jamais commerciale, cependant je persiste à te dire que le principe même est voué à l'echec.

Avec ton principe, il faudrait bloquer le bouton envoyer après l'envoi d'un message jusqu'a ce que le client réponde, car si nous répondons à peu près en même temps, il se peut su'un message soit perdu. Garde à l'esprit que le dernier client qui upload le fichier texte efface focrément l'ancien. A moins d'utiliser AppendText mais le souci sera alors la gestion de l'effacement du fichier ce qui reviendra au même.

Voici une source qui te conviendra à merveille : http://www.vbfrance.com/codes/NET2-CLIENT-FTP-COMMENT-UTILISER-CLASSES-FTPWEBRESQUEST-FTPWEBRESPONSE_41909.aspx

Voila, bon courrage et si tu as des questions en cours de dev n'hésite pas, la source est assez complexe.

@+ Mayzz.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
3
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 juin 2010 à 12:33

Ce problème est majeur pour le fonctionnement de la messagerie, j'y ai un peu réfléchi et je pense qu'on peut y remédier en gardant l'idée des 5 derniers messages en ligne mais en les stockant dans 5 fichiers différents. Quand un client ajoute un message il upload un fichier et supprime le dernier des 5. A chaque actualisation des messages en ligne (avec le timer) les 5 fichiers sont téléchargés. Il n'est donc plus nécessaire d'actualiser lors d'un envoie de nouveau fichier et le processus d'envoie d'un nouveau message (upload) peut être complètement indépendant de la lecture des messages (download)...


Pourquoi ne pas créer un répertoire par compte client, lors de la création de celui-ci. Tel telle façon à avoir :

Compte 1 | Jean`| /xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Chaque compte serait associé à un répertoire, chaque répertoire serait créé par FTP lors de la création du compte, et serait nommé par un GUID, de cette façon tu ne peux avoir deux dossiers identique. Ce qui évite de nommer les dossiers par le nom d'utilisateur qui comporte souvent des caractères invalides pour le système de fichier "*!/\?:><|

En suivant ton pricipe, un utilisateur qui voudrait envoyer un message à Jean, lui envréais dans son dossier un fichier texte contenant le pseudo, la date, l'heure et le message. Le client de Jean qui est ouvert et qui à alors un timer va rechercher les fichiers présent dans son dossier et les effacera après téléchargement et lecture. Pour l'affichage, des message dans l'ordre, une fois tous les fichiers lu en mémoire c'est une simple question de traitement sous vb.

Je pense que ce pricipe fonctionnerais, ce pendent il n'est pas valable pour des salons et ce procédé ne permet pas de savoir qui est connecté ou non.

Pour ce qui est de ton problème avec la source, tu parles de la source elle même ou d'un nouveau projet dans lequel tu as copier les classes de la source ?

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
3
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 juin 2010 à 15:02
ou alors à faire une table de correspondance entre GUID et nom intelligible.


Pour pouvoir l'appliquer sur un autre projet est-ce que tu pourrais m'indiquer quelles classes récupérer dans un nouveau projet pour faire marcher ces fonctions ?


Si tu tiens vraiment à créer ce programme par toi même, le mieux reste de décortiquer le programme pour savoir comment il fonctionne en interne, un bête "copiée/collé" d'une source ne t'apprendrais rien. Je sais c'est chiant d'apprendre quand on n'a pas les connaissances mais c'est comme cela que l'on progresse. Et plus on progresse et plus on apprend vite et plus apprendre devient un plaisir.

Si tu vas dans le sens contraire, tu vas exporter une classe permettant l'accès FTP du logiciel pour laquelle elle a été conçu, tu risques de te retrouver avec des bugs sans même savoir d'ou ils proviennent, et passer plus de temps à déboguer ton soft qu'à apprendre les choses, pour moi cela ne vaut pas le coup.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
3
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 juin 2010 à 16:53
Pour ce qui est de cette source, elle est fonctionnelle chez moi, as-tu entrez l'adresse du serveur dans un format correct ?

> ftp://ftp.olympe-network.com

J'ai téléchargé la source telle quelle, je l'ai lancé avec ma version VB 2008 qui l'a convertie sans générer d'erreur. Je lance l'exécution de cette source (en mode debug) et une fois que la fenêtre est chargée à l'écran, je rentre mes identifiants et je clique sur "OK". Là ça plante et ça me propose d'envoyer un rapport d'erreur.


Quelques fois cela arrive lors ce qu'une erreur se produit durant le load du formulaire, mais dans ton cas je ne comprent pas. Est-ce l'application en exécution qui plante ou carrément Visual Studio ?

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
3
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 juin 2010 à 23:37
Cela ne m'était pas venu à l'idée de mettre ce format (les clients FTP ainsi que les autres fonctions demandaient le format hostname).


C'était la ou je voulais en venir, lors ce que le code est fait par quelqu'un d'autre on à tendance à se comporte comme si il s'agissait d'un programme tout fait avec plein de fonctionnalités, or les source sont souvent issues de programmes développés à titre personnel ou professionnel répondant à un cahier des charges précis qui ne résulte pas du besoin du grand public. C'est donc pour cela que l'on passe souvent plus de temps à corriger les erreurs des autres plutôt qu'à apprendre et de développer par soit même.

Au début je faisais comme toi (moi même autodidacte), je copiais bêtement les classes et fonctions, puis quand cela ne fonctionnait pas je ne me cassais pas la tête, je cherchais une autre source jusqu'a ce que cela fonctionne et mes programmes étaient toujours truffés de bugs, et ne fonctionnaient jamais correctement. Lors ce que je me suis intéressé au contenu de celle-ci, j'ai pu voir les erreurs d'adaptation que j'avais commises, mais souvent, j'ai pu m'apercevoir que les codes développés n'étaient pas optimisés, voir bogués dans certains cas.

Aujourd'hui, j'en suis à un point ou je me refuse catégoriquement l'utilisation, de tous composants, API, Contrôles, codes, saisis par quelqu'un d'autre que moi lors ce que cela est possible, bien entendu j'exclus les librairies et contrôles développés par des sociétés/organisations pros qui sont de toute confiance. Si je dois me servir d'une source ici, je ne ferais jamais de copié/collé vers une appli, j'en comprendrais le fonctionnement, voir même dans la plus part des cas les fonctionnalités avancées autres que celle montrés dans la source. Non pas que les sources soient de mauvaises qualités et les auteurs médiocres bien au contraire, mais simplement car mon besoin sera toujours différent de la source initiale, même si ce besoin diffère de peu.

Ce sujet est donc théoriquement clos puisque j'ai ma réponse et plus encore. Je ne connais pas bien le site, souhaites-tu que je valide tes réponses en appuyant sur "Réponse acceptée" ?


Si tu ne connais pas bien ce site et que tu souhaite parfaire tes connaissances en VB alors tu va vite devenir accro je pense , pour la réponse oui, en effet le mieux serait que tu valides, ainsi pour les futurs recherches des membres ceux-ci verront la réponse validé et viendrons consulter ce thread au lieu de reposter bêtement la même question.

Désolé de revenir sur de la technique mais comment pourrais-je faire pour vérifier si le serveur est bien connecté ? Dans ma première source il y avait une méthode "Ftp.IsConnected".


Je suppose que tu vise juste...

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
3
Skanenruf Messages postés 38 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 30 juin 2010
28 juin 2010 à 17:15
Bonjour et merci de votre réponse !

J'ai bien attendu la fin du téléchargement, le fichier apparait dans le dossier cible mais il est complètement vidéo (il n'y a plus rien à l'intérieur) et le système indique une taille de 0 ko. Ça fait pareil pour l'upload et le download.

J'ai vu plusieurs fois ce problème dans les forums mais je n'ai jamais réussi à le résoudre par moi même. Regardez dans les messages du lien où je l'ai téléchargé, un certain jullouyot_46 parle de ce problème mais il semble qu'il utilise son ordinateur en FTP ce que je ne fais pas.

Je ne vois pas de quoi vous parlez par "relecture". J'ai effectué un débogage pas à pas et il n'y a de toute façon aucune ligne de code qui viderai le fichier. Je pense que l'erreur se situe dans les paramètres du ftp (je ne m'y connais pas trop) ou alors dans des paramètres à activer/désactiver dans l'ordinateur du client pour permettre ce transfert.

Merci beaucoup !
0
Skanenruf Messages postés 38 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 30 juin 2010
28 juin 2010 à 18:50
Bonjour,

Tout d'abord, merci beaucoup pour votre réponse.

Je n'ai pas assez apporté d'informations, il vaut mieux que je vous énonce le court parcourt de mon travail sur ces fonctions pour vous éviter pas mal de questions.

J'ai en premier téléchargé les fonctions toutes prêtes de ce lien que je vous ai posté Tapez le texte de l'url ici.. J'ai testé les fonctions avec l'exemple indiqué dans le code visible depuis le navigateur :

        ' Paramètrage de la connexin
        Client.Hostname = "ftp.yahoo.com"
        Client.Username = "michel"
        Client.Password = "password"

        ' Connexion au serveur
        Client.Connect()

        ' Vérification si bien connecté
        If Not Client.IsConnected Then
            msgBox("Error")
        Else
            ' Download du fichier
            If Client.DownloadFile("index.htm", "c:\tmp1\index.htm") Then
                MsgBox("OK")
            Else
                MsgBox("Error")
            End If
            ' Ipload du fichier sur un autre nom
            If Client.UploadFile("c:\tmp1\index.htm", "test.htm") Then
                MsgBox("OK")
            Else
                MsgBox("Error")
            End If
        End If


Pour être plus précis, dans les début du test de ces fonctions j'ai eu quelques problèmes où les fichiers étaient vidés mais en général ça marche chez moi (je n'ai plus eu de problème depuis longtemps). J'ai commencé à développer mon logiciel autour de ces fonctions et je l'ai envoyé à un ami (j'ai copié le répertoire Debug généré par Visual Studio) et c'est là que ça n'a pas marché chez lui. Il m'a indiqué que le fichier déplacé était vidé et que le système (dans les propriétés du fichier) indiquait une taille de 0 ko.

Dans la suite de la programmation, si j'obtiens des fonctions parfaitement fonctionnelles je manipulerai les fichiers grâce à des streams et grâce à la classe File du framework mais je n'ai pour le moment pas utilisé ces outils puisque les fonctions de transferts FTP ne sont pas très stables.

Pour tester le download je crée manuellement un fichier .txt ou .ini que je place grâce à Filezilla sur un serveur FTP (d'un hébergeur gratuit : Olympe-Network) et ensuite j'appelle la fonction en ciblant le fichier sur le serveur et en indiquant le chemin sur mon disque dur). Je vais ensuite voir tout simplement avec l'explorateur de Windows si je fichier est bien là, c'est le cas mais il arrive qu'il soit vidé. Pour l'upload je fais pareil avec un fichier que j'ai crée manuellement sur mon disque dur et que j'envoie sur le serveur.

Je peux vous envoyer mon projet (il n'est pas du tout lourd, il ne contient que quelques fenêtres et assez peu de lignes de code). C'est en fait un projet de messagerie instantanée (comme MSN) mais juste avec un serveur FTP (les clients se connectent au FTP pour lire le dernier message). Je n'ai programmé que le système de compte qui est stocké grâce à des fichiers .ini sur le FTP que j'ai ouvert. Je n'ai pas envie de vous encombrer avec le code tout de suite, dîtes moi si ça peut vous aider !

Merci beaucoup une fois de plus !

PS. Je me dis que mon problème doit être assez difficile à résoudre s'il est résolvable. Alors si quelqu'un connaîtrai une DLL pour se connecter simplement à un serveur FTP (host, user et pass) et "downloader" ou "uploader" des fichiers je suis tout à fait preneur !
0
Skanenruf Messages postés 38 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 30 juin 2010
28 juin 2010 à 21:54
Bonsoir Mayzz,

Merci pour ta réponse et tes indications. Je savais que le FTP n'était pas un protocole fait pour ça mais c'est une sorte de défi : réaliser une messagerie instantanée sans utiliser d'application serveur exécutable et donc de serveur dédié.

Je pense qu'en étendant les serveurs FTP grâce à des serveurs 100 Mo ouvert chez des hébergeurs gratuits je peux créer un système de messagerie tout à fait rapide (sans que les délais ne soit gênant). Il y aurait un "méta-serveur" pour stocker les données des comptes.

Comme je n'ai pas de serveur dédié et que je suis très motivé par ce projet je vais tout de même persévérer (mais je suis mis en garde sur l'inefficacité de ce protocole pour cette application).

J'ai fait des recherches sur les classes FtpWebRequest et FtpWebResponse et sincèrement je comprends rien ! La seule qu isemble plus compréhensible pour moi ça serait la classe WebClient (mais j'ai pas compris où on indique l'hostname, l'username et le pass).

Ce que je cherche en réalité ça serait juste trois fonctions : se connecter à un serveur (avec l'host, l'user et le pass), envoyer un fichier sur le serveur (upload) et télécharger un fichier du serveur (download). Avec ces trois fonctions qui marchent parfaitement. Que ça soit en fonction code source ou en DLL déjà compilée ça m'est égal !

J'ai fait pas mal de recherche et j'ai vu que Jack qui a publié en haut de ce sujet a développé une DLL mais malheureusement elle est en VB6.

Merci beaucoup en tout cas pour ton aide !
0
Skanenruf Messages postés 38 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 30 juin 2010
28 juin 2010 à 23:02
Il me semble que j'ai bien compris que ce protocole est inadapté ! Je suis d'accord mais à vrai dire je suis content de pouvoir monter quelque chose à peu près tout seul (je ferais tout tout seul si j'ai mes trois fonctions qui marchent). Evidemment ça ne sera pas compétitif avec MSN, ni Skype ni tous les nouvelles messageries en AJAX et tout !

J'ai réfléchi à ce projet il y a longtemps et c'est à l'époque que j'ai découvert cette idée. J'ai tout simplement pensé à sauvegarder les 5 derniers messages d'une conversation (tous participants confondus) dans le fichier dédié à la conversation. Ce seuil des 5 messages (pour la BP) me semble ne pas poser de problème avec des connexions normales et des gens normaux (pas des gens qui tapent les 100 touches à la seconde). Pour des raisons d'espace sur le disque les anciens messages ne sont sauvegardé qu'au niveau local par chaque client dans un historique des conversations.

En fait, dès qu'un client publie un message il récupère le fichier, enlève le dernier message et en ajoute un en haut. Un algorithme que je développerai permettra de trier les nouveaux messages apparus entre temps dans la liste des 5. Tu vas me dire ce rafraichissement ne s'obtient que si le client A écrit au client B, non car il y a un timer qui met à jour sur une fréquence encore non déterminée (et modifiable dans les options pour adapter à la connexion internet du client). Cela permettra d'éviter de limiter le nombre de messages envoyés en différé (comme sur MSN où c'est limité) car le serveur ne stocke pas plus que quand les deux clients sont actifs !

Je pense commencer par des conversations à deux, et si il me vient l'idée de créer des salons de discussion (conversation à plus de deux) alors j'augmenterai sûrement de façon proportionnelle au nombre de participants le seuil du nombre de messages affichés dans le fichier sur le FTP !

Je te le redis sincèrement : merci beaucoup de ton aide ! J'ai pris note de tes conseils mais à part tomber sur un problème technique, mon idée marcherait dans la théorie. De plus un download de fichier est très rapide (pour le timer), je viens de faire un panneau d'inscription qui vérifie si l'identifiant saisi est utilisé ou pas en téléchargeant un fichier à chaque modification du champ de texte (avec l'évènement _TextChanged) et ça suit largement la vitesse de quelqu'un qui écrit son identifiant rapidement (autant dire dans les 3 téléchargements/seconde, plus que le délai de mon timer !!).

Merci encore pour ton aide technique et cette discussion sur la théorie . Notons que j'ai toujours pas trouvé de DLL ou classe qui fasse mes trois fonctions !

PS. Je viens de tester un code d'upload en passant par une console DOS (via un shell) mais le fichier stockant les informations du serveur doit être à la racine du disque dur (C:\) et cette racine n'est accessible qu'en mode administrateur sur Win7 (et Vista je crois). Voici la source : http://www.vbfrance.com/codes/FTP-SANS-OCX-DOTNET_5383.aspx
0
Skanenruf Messages postés 38 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 30 juin 2010
29 juin 2010 à 11:58
Bonjour,

Effectivement, en utilisant un seul fichier pour chaque conversation il y a une faille qui dure le temps de la mise en ligne d'un nouveau message par un client. D'où la nécessité de trouver des fonctions upload/download les plus rapides possible.

Ce problème est majeur pour le fonctionnement de la messagerie, j'y ai un peu réfléchi et je pense qu'on peut y remédier en gardant l'idée des 5 derniers messages en ligne mais en les stockant dans 5 fichiers différents. Quand un client ajoute un message il upload un fichier et supprime le dernier des 5. A chaque actualisation des messages en ligne (avec le timer) les 5 fichiers sont téléchargés. Il n'est donc plus nécessaire d'actualiser lors d'un envoie de nouveau fichier et le processus d'envoie d'un nouveau message (upload) peut être complètement indépendant de la lecture des messages (download).

Pour organiser les fichiers sur le FTP, je pourrai créer un répertoire lors de l'ouverture d'une nouvelle conversation et stocker les 5 fichiers textes dedans), ce répertoire serait supprimé à la fin de la conversation. Ou alors je mets les fichiers en vrac à la racine (si c'est plus rapide) avec un nom constitué d'un identifiant de la conversation suivi du numéro du message (ex : 1235-45 si 1235 est l'id de la conversation et c'est le message 45). Ça évite de renommer chaque message à chaque ajout (comme si ils étaient appelés 1, 2, 3, 4 et 5). Lors d'un ajout de message, le nouveau fichier serait nommé en incrémentant la valeur du dernier message avant l'ajout et le client supprimerait le message le plus ancien (en faisant numéro du nouveau message - 5).

Penses-tu que ce système pourrait marcher dans la théorie ? Je cherche une faille théorique comme celle que tu viens de me montrer !

J'ai téléchargé la source que tu m'as indiqué et effectivement il me semble qu'elle est très complète et adaptée à ce que je souhaite faire. J'ai tout de même quelques problèmes. Quand je lance l'exécution et que je rentre les identifiants FTP de mon serveur FTP (qui sont bons) ça plante et propose d'envoyer un rapport d'erreur. J'ai regardé dans le code et j'ai exécuté de façon différée la fonction de connexion (Ftp.SetConfiguration(...)) des autres et celle ci ne plante pas (je ne sais pas si c'est correctement connecté mais ça passe sans erreur). Par contre les fonctions comme Ftp.DownloadFile ou Ftp.FillListview("/") renvoient sur un rapport d'erreur.

J'exécute ces lignes dans le sub Demo_Load (le FormLoad de la fenêtre principale) :

Ftp.SetConfiguration("ftp.olympe-network.com", "mon_user", "mon_pass")
Ftp.DownloadFile("texte.txt", "C:\texte.txt")


Le fichier texte.txt se trouve à la racine du FTP et pourtant ça plante sur la ligne Ftp.DownloadFile en demandant d'envoyer un rapport d'erreur.

Merci beaucoup pour ton aide !
Bonne journée, en espérant ne pas trop te prendre de ton temps !
Léo.
0
Skanenruf Messages postés 38 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 30 juin 2010
29 juin 2010 à 14:35
Ton idée est très intéressante et je vais tout de suite l'adopter. Jusqu'à présent j'avais un serveur (et pas un répertoire car ma fonction download bug moins souvent à la racine du serveur) qui stockait un fichier INI pour chaque compte.

Dès que j'aurais réussi à bien faire fonctionner les fonctions de transfert FTP de la source que tu m'as indiqué je suivrai ton idée en créant un répertoire pour chaque compte. Le nom du répertoire ne sera pas un GUID car je pense qu'un identifiant intelligible serait mieux. Il y aura donc un identifiant (composé de caractères minuscules et sans caractères spéciaux, espaces...) qui servira uniquement à la connexion, après l'utilisateur choisira un pseudonyme qu'il pourra modifier avec les caractères spéciaux qu'il souhaite. Ça évite d'avoir à retenir un numéro pour l'utilisateur ou alors à faire une table de correspondance entre GUID et nom intelligible.

Pour les salons de discussion mettant en scène plus de deux participants, il sera toujours possible de revenir sur mon idée initiale (avec les 5 fichiers) pour ce cas particulier. Merci beaucoup pour cette idée !


Pour continuer sur mon problème technique : pour tester les fonctions de la source et apprendre à les utiliser j'ai commencé par utiliser directement le projet de la source en ajoutant des lignes de code dans l'évènement FormLoad de la première fenêtre (Demo). J'ai peut-être fait une erreur de syntaxe. Pour pouvoir l'appliquer sur un autre projet est-ce que tu pourrais m'indiquer quelles classes récupérer dans un nouveau projet pour faire marcher ces fonctions ?

Merci beaucoup !
0
Skanenruf Messages postés 38 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 30 juin 2010
29 juin 2010 à 16:42
Je ne manque pas d'envie de progresser par moi même. Et j'ai au moins autant envie d'apprendre que de voir le résultat fini. Mais à vrai dire je pense que j'apprendrai plus en développant tout le reste de l'application avec des fonctions FTP que je n'ai pas programmé qu'en bloquant sur un problème un peu trop compliqué.

J'ai téléchargé la source telle quelle, je l'ai lancé avec ma version VB 2008 qui l'a convertie sans générer d'erreur. Je lance l'exécution de cette source (en mode debug) et une fois que la fenêtre est chargée à l'écran, je rentre mes identifiants et je clique sur "OK". Là ça plante et ça me propose d'envoyer un rapport d'erreur.

Le mieux que je puisse faire avec mon niveau de connaissance et tout la volonté qu'il faut pour essayer et apprendre c'est de trouver sur quelle fonction le programme plante. J'ai donc isolé la fonction de connexion au serveur (Ftp.SetConfiguration(...)) des autre et celle ci ne semble pas poser de problème, le programme la passe sans planter (ça semble logique puisqu'elle se contente d'assigner des objets). Là où le programme plante (avec le rapport d'erreur) c'est sur les autres fonctions (Ftp.DownloadFile, Ftp.FillListview("/")...). Comme mes identifiants sont bons et que la source est censée fonctionner j'en déduis que l'erreur doit se trouver sur la connexion avec le serveur. J'arrive pourtant à m'y connecter sans problème avec un navigateur (Google Chrome) ou avec un client FTP (Filezilla).

Je suis désolé de continuer à te prendre de ton temps. Si tu n'as pas le temps (ou l'envie) de m'expliquer ce n'est pas grave ! Je cherche juste à obtenir ces fonctions et qu'elles marchent ou à comprendre comment résoudre l'erreur parce que là je suis un peu perdu !

Merci beaucoup encore une fois !
0
Skanenruf Messages postés 38 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 30 juin 2010
29 juin 2010 à 23:05
Ben voilà ça marche ! C'était à cause de l'erreur de format de l'adresse (je l'indiquai en format hostname : ftp.olympe-network.com). C'est impressionnant à quel point les erreurs qui nous bloquent en programmation et en informatique en général peuvent être petites ou stupides quand on les connait ! Cela ne m'était pas venu à l'idée de mettre ce format (les clients FTP ainsi que les autres fonctions demandaient le format hostname).

J'ai réussi à me connecter à mon serveur FTP, à y envoyer des fichiers et à en télécharger. Tout marche à présent parfaitement, même chez mon ami chez qui il y avait un problème !

Je tiens à te remercier spécialement pour ton aide technique qui m'a été très précieuse puisqu'elle aboutit finalement à un succès dans ce que je recherchai. Ainsi que pour ton aide sur la théorie de mon projet, l'idée des répertoires est pertinente et m'aidera beaucoup ! Je sais que tu m'as longuement dit de ne pas implémenter des fonctions existantes et d'essayer de comprendre, j'ai vraiment envie d'avancer dans ce projet qui m'apprendra aussi beaucoup de choses et je peux désormais le faire ! Mais je te promets que j'aurai à me pencher sur ces histoires de FTP, sur ces protocoles, ainsi que sur ces fonctions !

Ce sujet est donc théoriquement clos puisque j'ai ma réponse et plus encore. Je ne connais pas bien le site, souhaites-tu que je valide tes réponses en appuyant sur "Réponse acceptée" ?

Je vais continuer sur mon programme et je te tiendrai au courant si j'arrive à en sortir du version utilisable !

[b]Merci beaucoup pour tout !
Une aide pertinente et rapide !
Léo.

PS./b Désolé de revenir sur de la technique mais comment pourrais-je faire pour vérifier si le serveur est bien connecté ? Dans ma première source il y avait une méthode "Ftp.IsConnected".
0
Skanenruf Messages postés 38 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 30 juin 2010
30 juin 2010 à 17:25
Salut,

J'ai installé les classes de la source dans ma solution, j'ai fait quelques adaptation d'efficacité dans mon programme et ça marche très bien. J'ai résolu le problème de la méthode indiquant la connexion au serveur manquante en ajoutant à la classe FtpClient un booléen IsConnected. Dans la fonction SetConfiguration je lance le téléchargement d'un fichier texte qui sera toujours sur mon serveur dans un try catch. Si le téléchargement est accompli avec succès c'est que le serveur est accessible, j'indique IsConnected True sinon (si la structure génère une exception dans le catch) c'est que le serveur est inaccessible, j'indique IsConnected False. Ça marche très bien.

Rien que pour faire cela j'ai du me pencher un peu sur les classes de transfert FTP. Je vais continuer à explorer ces classes tout en développant l'application, comme ça si j'ai un problème qui vient d'elles je serais plus autonome ! Il y a de plus en plus de procédures que je peux développer tout seul. Par exemple j'avais entièrement réalisé il y a quelques temps une classe pour gérer les fichiers INI (lire, écrire, supprimer des clés, sections, fichiers...) et ça me sert maintenant !

J'ai programmé ton idée dans mon application : désormais la création d'un compte entraine l'ouverture d'un dossier sur le serveur contenant plusieurs fichiers INI pour stocker les informations relatives au compte (un pour le profil, les identifiants, un autre pour la liste des contacts, un autre pour indiquer si le compte est en ligne ou hors ligne).

[b]Merci !
Léo./b

PS. J'ai marqué toutes tes réponses comme acceptée.
0
nvoisn Messages postés 26 Date d'inscription lundi 23 janvier 2012 Statut Membre Dernière intervention 29 septembre 2014 7
26 août 2011 à 09:16
Merci!!
0
Rejoignez-nous