8
votes

Comment une application C # peut-elle facilement communiquer et transférer des fichiers sur un réseau?

Comment une application C # peut-elle facilement communiquer avec une instance d'elle-même présente sur un autre ordinateur, qui se trouve sur le même réseau, et transférer des fichiers et des données?

En supposant que les ordinateurs sur le réseau ont des adresses IP locales fixes et elles connaissent chacune des autres IPS. Serait-il aussi un moyen de communiquer si les IP sont inconnus? Basé sur un protocole de découverte?

J'ai entendu le service "Bonjour" d'Apple était un bon protocole. Pouvons-nous communiquer via elle à partir de nos applications Windows? Ou devez-vous utiliser des "prises". Je cherche principalement des bibliothèques ou un exemple de code pouvant accomplir facilement mon besoin, je ne veux pas développer mon propre protocole basé sur TCP ni rien de hardcore!


0 commentaires

4 Réponses :


2
votes

Pour transférer les fichiers / données, vous pouvez utiliser le Tcpclient / TCplistener Classes, qui sont de belles abstractions sur la fonctionnalité de socket grittique. Ou, vous pouvez simplement avoir la demande en tant que serveur HTTP à l'aide du HTTplistener classe, si cela est plus facile / plus approprié pour votre application.

Pour la découverte, si vous êtes capable d'avoir un serveur central; Ensuite, vous pourriez avoir chaque client se connecter au serveur au démarrage, pour vous inscrire et récupérer une liste d'autres clients en ligne et leur adresse IP. La communication ultérieure peut alors avoir lieu directement entre les clients.

Une variante de ce schéma est de laisser le serveur central agir comme un proxy, que tout le trafic entre les clients passent à travers. Cela serait surtout utile pour surmonter les problèmes de pare-feu ou de routage si les clients ne sont pas sur le même réseau (il n'est donc pas nécessaire de ne pas nécessairement nécessaire pour votre scénario).


2 commentaires

Classes asp.net? Je cherchais que commun entre Windows Apps.


Que veux-tu dire ? Aucune des classes que je ne mentionne sont des classes ASP .NET.



5
votes

Vous pouvez utiliser Système. Net.Sockets classe pour communiquer et il a une méthode d'envoi de fichier socket.sendfile .

mise à jour:
C'est un bon exemple pour partage de fichiers et fichier d'envoi de C # Aide


1 commentaires

Vous voulez dire le system.net.sockets. Prise classe.



3
votes

La grande chose à propos des fichiers et des sockets en C # est qu'ils sont tous deux exposés comme des flux. Copier un gros fichier d'un flux à un autre est assez simple: xxx pré>

puis fermez simplement la prise lorsque vous avez terminé. P>

Si vous souhaitez envoyer des métadonnées (noms de fichiers , tailles) ou ne voulez pas fermer la connexion, vous avez besoin d'une sorte de protocole pour gérer cela. FTP utilise deux sockets séparées (une pour les métadonnées, une pour les données; cela s'appelle une communication hors bande). Si vous êtes sur un réseau local sans pare-feu, cela peut être parfaitement acceptable. D'autre part, si vous voulez faire un transfert Internet, un seul port ouvert est une tâche assez difficile et deux est insupportable. Si vous ne vous souciez pas trop de performances, vous pouvez coder les octets dans le codage de base64, ce qui s'assure qu'ils sont dans une certaine plage d'octets. Avec base64, vous pouvez séparer des messages avec de nouvelles lignes ou d'autres caractères non alphanumériques. Ensuite, dans le premier message, indiquez le nom de fichier, la taille ou autre chose, puis envoyez les données sous forme de message, puis envoyez un message "c'est le fichier entier" afin que le client sache que c'est fait. P>

Une autre tactique pour Les messages utilisent une séquence d'échappement. Par exemple, prenez votre bytestream et remplacez chaque instance de '\ 0' avec '\ 0 \ 0'. Utilisez maintenant '\ 0 \ 1' pour signaler la fin de messagerie, garantie pour ne pas être contenue dans votre message de données. Décodez le "\ 0 \ 0" à "\ 0 'sur la fin de la réception. Cela fonctionne assez bien en C, mais je trouve que, dans la pratique, la boucle à travers chaque octet peut être plus lente que la lecture de tampons entiers en C #. P>

Le meilleur moyen est d'adopter une sorte de protocole de longueur adaptatif. Par exemple, envoyez les données en morceaux d'une certaine taille (par exemple 512 octets). Avant chaque morceau, envoyez un INT de 32 bits représentant la taille du morceau via System.BitConverter. Donc, des messages ressemblent à ceci (anglais): p> xxx pré>

L'avantage ici est que vous pouvez faire fonctionner les tampons de copie / lecture pour vous (lire 512 octets à la fois), ce qui signifie Votre débit est limité par votre pile réseau au lieu de votre code C #. Le client lit la longueur fixe 32 bits Int qui lui permet de connaître la taille du tampon qu'il doit utiliser pour le segment [de données] suivant. p>

Voici un code pour écrire des messages comme celui-ci: p> xxx pré>

et voici un code pour les lire: p>

               byte[] intbuf = new byte[int_32_size];
        int offset = 0;
        while (offset < int_32_size)
        {
            int read = 0;

            read = d.plaintextStream.Read(intbuf,offset,int_32_size - offset);
            offset += read;

        }
        int msg_size = System.BitConverter.ToInt32(intbuf,0);
        //allocate a new buffer to fill the message
        byte[] msg_buffer = new byte[msg_size];
        offset = 0;
        while (offset < msg_size)
        {
            int read = 0;

            read = d.plaintextStream.Read(msg_buffer,offset,msg_size - offset);
            offset += read;
        }


        return msg_buffer;


0 commentaires

1
votes

Pour copier des fichiers, vous pouvez également consulter le fournisseur de synchronisation des fichiers qui fait partie du cadre Microsoft Sync. http://msdn.microsoft.com/en-us/sync/bb887623 .


0 commentaires