Wysyłanie plików przez TCP / .NET SSLStream jest powolne / nie działa

Piszę aplikację serwer / klient, która działa z SSL (ponadSSLStream), który musi robić wiele rzeczy (nie tylko odbieranie / wysyłanie plików). Obecnie działa tak: tam jest tylko jedno połączenie. Zawsze wysyłam dane z klienta / serwera za pomocąSSLStream.WriteLine() i korzystaj z niegoSSLStream.ReadLine(), ponieważ mogę wysyłać wszystkie informacje przez jedno połączenie i mogę wysyłać wszystkie wątki bez niszczenia danych.

Teraz chciałem zaimplementować wysyłanie i odbieranie plików. Podobnie jak inne rzeczy w moich aplikacjach klient / serwer, każda wiadomość ma prefiks (jak cl_files lub sth) i część treści zakodowaną w base64 (prefiks i treść są rozdzielone przez |). Zaimplementowałem udostępnianie plików w ten sposób: Przesyłający wysyła do odbiorcy wiadomość o całkowitym rozmiarze pliku, a następnie przesyłający wysyła części pliku zakodowane w base64 nad prefiksemr.

Mój problem polega na tym, że udostępnianie plików jest naprawdę powolne. Mam około 20 KB / s z localhost do localhost. Mam też inny problem. Jeśli zwiększę rozmiar zakodowanych w base64 części pliku (co przyspieszy udostępnianie plików), prefiksr nie wychodzi już do odbiornika (więc danych nie można zidentyfikować).

Jak mogę to zrobić szybciej?

Każda pomoc zostanie bardzo doceniona.

Mój (prawdopodobnie zły) kod jest dla klienta:

//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();

Dla serwera:

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;

questionAnswers(4)

yourAnswerToTheQuestion