Laden...

Dateien und Text auf verschiedenen Ports?

Erstellt von thetruedon vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.573 Views
thetruedon Themenstarter:in
111 Beiträge seit 2011
vor 12 Jahren
Dateien und Text auf verschiedenen Ports?

Hallo
Ich habe folgendes Problem: Ich habe eine Server und eine Client Anwendung bei der unter anderem Text aber auch Dateien gesendet werden. Man könnte es in den Grundzügen mit einer Art Chat vergleichen.
Ich sende alles als Base64 String um bestimmte Steuerzeichen welche in den Nachrichten sind zu eliminieren (Dateien können ja durchaus mal ein Escape oder Einfüge Zeichen oder ähnliches enthalten wenn man sie in eine ByteArray umwandelt). Jene Zeichen dürfen aus Verarbeitungsgründen nicht enthalten sein.
Dateien werden darüber hinaus in 4KB Stücken versendet damit nicht z.B. eine 1GB Datei komplett in den Arbeitsspeicher geladen wird beim Senden.
Aber genau das sorgt für Probleme. An sich funktioniert der Dateiversand solange zur gleichen Zeit keine Andere Nachricht von einem Client gesendet wird. Denn dann Überschneiden sich Datei und Text und es kommt zu Fehlern.
Jetzt meine Frage macht es sinn dem Programm zu sagen: "Warte bis die Datei fertig ist und verarbeite dann erst den Text" weil das meines Erachtens recht umständlich ist oder sollte ich das Grundkonzept des Datei Sendens komplett überdenken. Ich dachte schon über verschiedene Ports und Threads für Datei und Text nach. Ist es Üblich Dateien und Text vollständig getrennt über verschiedene Ports in z.B. Chatprogrammen zu senden. Und würde das überhaupt ein richtiger Ansatz sein bei meinem Problem?

Kommt ein Mann in die Wirtschaft und sagt zum Wirt: 16 Bit!
Sagt der Wirt: Das ist ein Wort!

P
157 Beiträge seit 2010
vor 12 Jahren

Ich weiß nicht wie man es am besten macht, aber du könntest doch am Anfang der Daten den Verwendungszweck mit schicken also:

  1. Datei Nr. sowieso
  2. Append
  3. Länge der Daten
  4. Daten
48 Beiträge seit 2010
vor 12 Jahren

Ich habe selbst über solche Probleme nicht nachgedacht, aber eventuell ist es ein guter Ansatz einmal zu schauen wie "die Andren" es machen. Hier einmal die Spezifikation für XMPP eventuell kann Dich das inspirieren? XEP-0096 File Transf.

thetruedon Themenstarter:in
111 Beiträge seit 2011
vor 12 Jahren

@PPK
Klingt schon mal ganz brauchbar wobei wahrscheinlich auf die Masse der Dateiteile bei Großen Dateien gesehen recht zeitraubend da ja jedes mal Stringverarbeitung wie schneiden suchen oder so stattfinden muss bei noch mehr Daten.
Eine Idee wäre auch wenn eine Textnachricht erkannt wird, das Aufbauen der Datei zu unterbrechen. Jedoch alles samt nicht elegant irgendwie. Ich wäre interessiert zu wissen wie Bekannte Progs wie ICQ Skype oder so es managen mit dem Versand von Files neben dem Paralelen senden von Text. Ich brauche es zwar nicht so komplex wie ein echtes Chatprogramm aber Ansätze sollten sich ähneln

Zum zweiten Vorschlag: Schon mal danke sieht erst mal nach recht viel zu lesen für mich aus^^ aber da kommt man wohl nicht drumherum

Kommt ein Mann in die Wirtschaft und sagt zum Wirt: 16 Bit!
Sagt der Wirt: Das ist ein Wort!

W
872 Beiträge seit 2005
vor 12 Jahren

Verschiedene Ports oder zumindest dedizierte Verbindungen je nach Inhalt(Binaer oder Text) sind am einfachsten.

thetruedon Themenstarter:in
111 Beiträge seit 2011
vor 12 Jahren

Ich habs jetzt erstmal mit PPKs Ansatz gelöst
Habe weitestgehend die Daten Komprimiert und einen brauchbaren Header mit Hashcode und Indizierung der Dateien gemacht versteht sich.
Sollte ich eine schönere Variante finden poste ich die noch

Kommt ein Mann in die Wirtschaft und sagt zum Wirt: 16 Bit!
Sagt der Wirt: Das ist ein Wort!

106 Beiträge seit 2011
vor 12 Jahren

Nutzt du Wcf? Wenn ja dann kannst du das relativ einfach in 2 verschiedene Messages packen. Eine für die Datei und eine für den Text, die Datei kannst du dann auch als Stream übertragen. Damit sparst du dir den Overhead das es in den Speicher geladen werden muss.
Das ganze würde dann in etwa so aussehen:


    [MessageContract]
    public class FileTransferMessage
    {
        [MessageHeader(MustUnderstand = true)]
        public string FileName { get; set; }

        [MessageBodyMember(Order = 1)]
        public Stream DataStream { get; set; }

    }

eine ähnliche Message kannst du dann für den Text verwenden, nur anstatt den Stream beinhaltet diese dann einen String.

Wenn der Service dann noch als:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]

definiert ist, sollte das ganze Problemlos klappen, du solltest den InstanceContextMode auch problemlos als PerSession laufen lassen können, wenn du das benötigst.

MfG
Rabban