Das Senden von Dateien über TCP / .NET SSLStream ist langsam / funktioniert nicht

Ich schreibe eine Server / Client-Anwendung, die mit SSL arbeitet (überSSLStream), was viele Dinge zu tun hat (nicht nur das Empfangen / Senden von Dateien). Derzeit funktioniert es so: Es gibt nur eine Verbindung. Ich sende die Daten immer vom Client / Server mitSSLStream.WriteLine() und erhalten es mitSSLStream.ReadLine(), weil ich alle Informationen über eine Verbindung senden kann und von allen Threads aus senden kann, ohne die Daten zu zerstören.

Jetzt wollte ich das Senden und Empfangen von Dateien implementieren. Wie andere Dinge in meinen Client / Server-Apps hat jede Nachricht ein Präfix (wie cl_files oder sth) und einen base64-codierten Inhaltsteil (Präfix und Inhalt sind durch | getrennt). Ich habe die Dateifreigabe folgendermaßen implementiert: Der Uploader sendet eine Nachricht über die Gesamtgröße der Datei an den Empfänger, und danach sendet der Uploader die base64-codierten Teile der Datei über das Präfixr.

Mein Problem ist, dass die Dateifreigabe sehr langsam ist. Ich habe ungefähr 20KB / s von localhost zu localhost. Ich habe auch ein anderes Problem. Wenn ich die Größe der base64-codierten Teile der Datei erhöhe (wodurch die gemeinsame Nutzung von Dateien schneller wird), wird das Präfix verwendetr geht nicht mehr zum Empfänger (daher konnten die Daten nicht identifiziert werden).

Wie kann ich es schneller machen?

Jede Hilfe wird sehr geschätzt.

Mein (vermutlich schlechter) Code ist für den Kunden:

//its running inside a Thread
FileInfo x = new FileInfo(ThreadInfos.Path);
long size = x.Length; //gets total size
long cursize = 0;
FileStream fs = new FileStream(ThreadInfos.Path, FileMode.Open);
Int16 readblocks = default(Int16);
while (cursize < size) {
    byte[] buffer = new byte[4096];
    readblocks = fs.Read(buffer, 0, 4096);
    ServerConnector.send("r", getBase64FromBytes(buffer));//It sends the encoded Data with the prefix r over SSLStream.WriteLine
    cursize = cursize + Convert.ToInt64(readblocks);
    ThreadInfos.wait.setvalue((csize / size) * 100);//outputs value to the gui
}
fs.Close();

Für den Server:

case "r"://switch case for prefixes
           if (isreceiving)
           {
              byte[] buffer = getBytesFromBase64(splited[1]);//splited ist the received Line over ReadLine splitted by the seperator "|"
              rsize = rsize + buffer.LongLength;
              writer.Write(buffer, 0, buffer.Length);//it writes the decoded data into the file
              if (rsize == rtotalsize)//checks if file is completed
              {
                 writer.Close();
              }
           }
break;

Antworten auf die Frage(4)

Ihre Antwort auf die Frage