Я пишу серверное/клиентское приложение, которое работает с SSL (через SSLStream
), которое должно делать много вещей (не только получать/отправлять файлы). В настоящее время это работает так: есть только одно соединение. Я всегда отправляю данные с клиента/сервера, используя SSLStream.WriteLine()
, и получаю их, используя SSLStream.ReadLine()
, потому что я могу отправлять всю информацию по одному соединению и могу отправлять из всех потоков, не уничтожая данные.
Теперь мне захотелось реализовать отправку и получение файлов. Как и другие вещи в моих клиент-серверных приложениях, каждое сообщение имеет префикс (например, cl_files или sth) и часть контента в кодировке base64 (префикс и контент разделены |). Я реализовал обмен файлами так: загрузчик отправляет получателю сообщение об общем размере файла, после чего загрузчик отправляет части файла в кодировке base64 с префиксом r
.
Моя проблема в том, что обмен файлами очень медленный. Я получил около 20 КБ/с от локального хоста к локальному хосту. У меня есть и другая проблема. Если я увеличу размер частей файла, закодированных в 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;
return System.Convert.FromBase64String(input);
Завтра я попытаюсь удалить Base64, но как я могу отправить массив байтов через Stream.ReadLine()? - person Tearsdontfalls   schedule 10.09.2012