Отправка файлов через 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;