Frage

Wie kann eine C # app leicht mit einer Instanz von sich selbst auf einem anderen Computer vorhanden kommunizieren, die auf dem gleichen Netzwerk, und die Übertragung von Dateien und Daten?

die Computer im Netzwerk haben lokale feste IP-Adressen Unter der Annahme, und sie jeder kennen jede andere IPs. Wäre es auch eine Art und Weise zu kommunizieren, wenn die IP-Adressen nicht bekannt sind? basierend auf einigen Discovery-Protokoll?

Ich habe gehört, das „Bonjour“ Dienst von Apple ein gutes Protokoll ist. Können wir über es von unseren Windows-Anwendungen kommunizieren? Oder müssen Sie „Steckdosen“ verwenden. Ich suche in erster Linie für Bibliotheken oder Beispielcode, der mein Bedürfnis leicht erfüllen kann, ich will nicht mein eigenes TCP-basiertes Protokoll oder etwas hardcore entwickeln!

War es hilfreich?

Lösung

Für die Dateien / Daten übertragen, können Sie die TcpListener Klassen, die schöne Abstraktionen über die raueren Socket-Funktionalität ist. Oder könnten Sie haben einfach die Anwendung als HTTP-Server mit dem Httplistener Klasse, wenn die einfachen / sachgemäße für Ihre Anwendung.

Für Entdeckung, wenn Sie in der Lage, einen zentralen Server haben; dann könnten Sie jeder Client mit dem Server beim Start eine Verbindung haben, sich zu registrieren und eine Liste von anderen Online-Kunden und deren IP-Adressen abgerufen werden. Nachfolgende Kommunikation kann dann direkt zwischen den Kunden.

Eine Variation dieses Schemas ist es, die zentralen Server fungieren als Proxy zu lassen, die den gesamten Datenverkehr zwischen den Kunden durchfließen. Dies wäre vor allem hilfreich sein, Firewall oder Routing-Probleme zu überwinden, wenn die Clients nicht im selben Netzwerk ist (so ist es propably nicht für Ihr Szenario erforderlich).

Andere Tipps

Sie können mit System. Net.Sockets Klasse zu kommunizieren und sie haben eine Methode Datei für das Senden von Socket.SendFile .

Update:
Dies ist ein gutes Beispiel für File-Sharing und Senden von Dateien von C # Hilfe

Die große Sache über Dateien und Steckdosen in C # ist, dass sie sowohl als Strom ausgesetzt. Kopieren einer großen Datei von einem Strom zum anderen ist ziemlich einfach:

byte[] data = new byte[1024];
while(true) {
int bytesRead = filestream.read(data,0,data.Length);
if (bytesRead==0) break;
netstream.write(data,0,bytesRead);
}

Dann schließen Sie einfach die Steckdose, wenn Sie fertig sind.

Wenn Sie Metadaten (Dateinamen, Größen) senden wollen oder nicht wollen, die Verbindung zu schließen, müssen Sie irgendeine Art von Protokoll zu handhaben. FTP verwendet zwei separate Buchsen (eine für Metadaten, einen für Daten, das ist, out-of-Band-Kommunikation genannt). Wenn Sie ohne Firewalls auf einem LAN sind, dann kann das durchaus akzeptabel sein. Auf der anderen Seite, wenn Sie Internet-Übertragung tun wollen, ein einzeln Port offen bekommen ist eine schwer genug Aufgabe, und zwei ist unerträglich. Wenn Sie über die Leistung nicht zu viel kümmern, könnten Sie das Bytes in Base64-Codierung codieren, die dafür sorgt, dass sie innerhalb eines bestimmten Byte-Bereichs ist. Mit Base64, können Sie trennen Nachrichten mit Zeilenumbrüche oder andere nicht-alphanumerischen Zeichen. Dann in die erste Nachricht enthalten den Dateinamen, die Größe, oder was auch immer, dann die Daten als eine zweite Nachricht senden, dann senden Sie eine „das ist die ganze Datei“ Nachricht so der Kunde weiß es gemacht wird.

Eine andere Taktik für Nachrichten verwendet eine Escape-Sequenz. Nehmen Sie zum Beispiel Ihre Bytestrom und ersetzen Sie jede Instanz von ‚\ 0‘ mit ‚\ 0 \ 0‘. Jetzt verwenden ‚\ 0 \ 1‘ die End-of-Nachricht zu signalisieren, die nicht in Ihrer Datennachricht enthalten ist, gewährleistet ist. Dekodieren die ‚\ 0 \ 0‘ zurück zum ‚\ 0‘ auf der Empfängerseite. Das funktioniert gut genug, um in C, aber ich finde, dass in der Praxis durch jedes Byte Looping langsamer sein kann als ganzen Puffer in C # zu lesen.

Der beste Weg ist eine Art adaptiver Länge Protokoll zu verabschieden. Zum Beispiel kann die Daten in Blöcken einer bestimmten Größe senden (etwa 512 Bytes). Vor jeder Chunk, ein 32-Bit-int senden, um die Größe des Chunks über System.BitConverter darstellen. So Nachrichten wie folgt aussehen (Englisch):

Here's 512 bytes:
[data]
Here's 512 bytes:
[data]
Here's 32 bytes:
[data]
Here's 4 bytes:
That was the whole file

Der Vorteil hierbei ist, dass Sie die Kopie / Lesepuffer für Sie arbeiten können (512 Bytes zu einem Zeitpunkt, zu lesen), was bedeutet, Ihr Durchsatz von Ihrem Netzwerk-Stack begrenzt statt C # -Code. Der Client liest die mit fester Länge 32-Bit-int, die es wissen, die Größe des Puffers lässt sie für den nächsten [Daten] Segment verwendet werden soll.

Hier ist ein Code zu schreiben Nachrichten wie folgt aus:

        logger.logger.debug("Sending message of length " + length);
        byte[] clength = System.BitConverter.GetBytes(buffer.Length);
        plaintextStream.Write(clength,0,clength.Length);
        plaintextStream.Write(buffer,0,buffer.Length);
        plaintextStream.Flush();

Und hier ist ein Code, um sie zu lesen:

               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;

Dateien kopieren Sie auch bei Datei-Synchronisation Provider suchen möchten, die Teil von Microsoft Sync Framework ist. http://msdn.microsoft.com/en-us/sync/bb887623 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top