El envío de archivos a través de TCP / .NET SSLStream es lento / no funciona

Estoy escribiendo una aplicación de servidor / cliente que funciona con SSL (sobreSSLStream), que tiene que hacer muchas cosas (no solo recepción / envío de archivos). Actualmente, funciona así: hay una sola conexión. Siempre envío los datos desde el cliente / servidor usandoSSLStream.WriteLine() y recibirlo usandoSSLStream.ReadLine(), porque puedo enviar toda la información a través de una conexión y puedo enviar desde todos los subprocesos sin destruir los datos.

Ahora quería implementar el envío y recepción de archivos. Al igual que otras cosas en mis aplicaciones cliente / servidor, cada mensaje tiene un prefijo (como cl_files o sth) y una parte de contenido codificado en base64 (el prefijo y el contenido están separados por |). Implementé el uso compartido de archivos así: el cargador envía al receptor un mensaje sobre el tamaño total del archivo y, a continuación, envía las partes codificadas en base64 del archivo sobre el prefijor.

Mi problema es que el intercambio de archivos es muy lento. Tengo alrededor de 20KB / s de localhost a localhost. También tengo otro problema. Si aumento el tamaño de las partes codificadas en base64 del archivo (lo que hace que el uso compartido de archivos sea más rápido), el prefijor Ya no sale al receptor (por lo que no se pudieron identificar los datos).

¿Cómo puedo hacerlo más rápido?

Cualquier ayuda será apreciada.

Mi código (probablemente malo) es para el cliente:

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

Para el servidor:

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;

Respuestas a la pregunta(4)

Su respuesta a la pregunta