Отправка файлов через TCP / .NET SSLStream работает медленно / не работает

Я пишу сервер / клиентское приложение, которое работает с SSL (болееSSLStream), который должен делать много вещей (не только прием / отправка файлов). В настоящее время работает так: есть только одно соединение. Я всегда отправляю данные с клиента / сервера, используяSSLStream.WriteLine() и получить его, используяSSLStream.ReadLine()потому что я могу отправить всю информацию по одному соединению, и я могу отправлять из всех потоков, не уничтожая данные.



Теперь я хотел реализовать отправку и получение файла. Как и другие вещи в моих клиент-серверных приложениях, каждое сообщение имеет префикс (например, cl_files или sth) и часть содержимого в кодировке base64 (префикс и контент разделяются |). Я реализовал общий доступ к файлам следующим образом: загрузчик отправляет получателю сообщение об общем размере файла, и после этого загрузчик отправляет части файла в кодировке base64 через префикс.r



Моя проблема в том, что обмен файлами очень медленный. Я получил около 20 КБ / с от localhost до localhost. У меня есть и другая проблема. Если я увеличу размер закодированных в base64 частей файла (что ускоряет обмен файлами), префиксr больше не выходит к получателю (поэтому данные не могут быть идентифицированы).



Как я могу сделать это быстрее?



Любая помощь будет оценена.

Мой (возможно плохой) код для клиента:

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

Для сервера:

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;

Ответы на вопрос(4)

Ваш ответ на вопрос