SSL(over SSLStream
)で動作するサーバー/クライアントアプリケーションを作成しています。これは、ファイルの送受信だけでなく、多くのことを行う必要があります。現在、次のように動作します。接続は 1 つだけです。1 つの接続ですべての情報を送信でき、データを破壊することなくすべてのスレッドから送信できるため、
私は常に を使用してクライアント/サーバーからデータを送信し、SSLStream.WriteLine()
それを使用して受信します。SSLStream.ReadLine()
次に、ファイルの送受信を実装したいと思いました。クライアント/サーバー アプリの他のものと同様に、すべてのメッセージにはプレフィックス (cl_files や sth など) と base64 でエンコードされたコンテンツ部分 (プレフィックスとコンテンツは | で区切られています) があります。私はそのようにファイル共有を実装しました: アップローダは受信者にファイルの合計サイズに関するメッセージを送信し、その後、アップローダはファイルの base64 でエンコードされた部分を prefix 経由で送信しますr
。
私の問題は、ファイル共有が非常に遅いことです。localhost から localhost まで約 20KB/s を取得しました。私には別の問題もあります。ファイルの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;