Как преодолеть медленное приложение FileSharing через WLAN
После большого количества исследований и исследований мне предложили на Stackru лучше использовать FileStream
чтобы открыть файл на клиентском компьютере, отправьте имя файла перед отправкой данных на сервер (прослушивание по заранее заданному порту), прочитайте данные фиксированного размера в буферный фрагмент, отправьте его на удаленный сервер. Все Эти операции были протестированы мной с использованием различных размеров буфера, начиная с 10 КБ до 100 МБ. Сейчас я проверил его для небольших файлов, и он работал хорошо. Я пошел с полезной идеей отправки файла 2 ГБ. Это заняло почти час.
Ниже приведена краткая закодированная идея.
Сторона клиента:
try
{
clientSocket.Connect(new IPEndPoint(ipaddrcl, port));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
NetworkStream netstream = clientSocket.GetStream();
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
try
{
TransmitFileName(netstream, Path.GetFileName(path));
int data_len = (int)fs.Length;
byte[] buffer = new byte[bufferSize];
int totalbytes = 0;
while (totalbytes < data_len)
{
var bytesread = fs.Read(buffer, 0, buffer.Length);
if (totalbytes == data_len)
{
break;
}
try
{
netstream.Write(buffer, 0, bytesread);
totalbytes += bytesread;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
pictureBox.Image = Properties.Resources.Warning;
labelProgress.Text = "Error in transmission";
}
}
}
finally
{
MessageBox.Show("Data transfer completed");
pictureBox.Image = Properties.Resources.Information;
labelProgress.Text = "Copying Done";
fs.Close();
netstream.Close();
// change button states
btnSend.Enabled = true;
btn_Cancel.Enabled = false;
}
}
Серверный:
Directory.CreateDirectory(Path.GetDirectoryName(fileloc));
try
{
using (FileStream fs = new FileStream(fileloc, FileMode.OpenOrCreate, FileAccess.Write))
{
netStream.CopyTo(fs);
pictureBox2.Image = Properties.Resources.spinningDisc1;
// label_server.Text = "Receiving Data";
}
}
catch (Exception e)
{
MessageBox.Show(e.Message.ToString());
}
finally
{
//check the size of file recieved
FileInfo fi = new FileInfo(fileloc);
long siz = fi.Length;
MessageBox.Show("Data Recieved: File Size is " + SizeSuffix(siz));
pictureBox2.Image = null;
// Thread();
}
Чтобы повысить скорость, я наткнулся здесь и проверил CopyFileEx
для копирования папок и деревьев на локальный хост, и он работал превосходно. Теперь вопрос в том, могу ли я использовать CopyFileEx
в WLAN, и если да, то как это гарантирует, что я записываю фрагмент данных по частям, и все же обеспечивает быстрый процесс.
PS. Я старался изо всех сил, чтобы не сделать это настолько продолжительным, но прежде чем спрашивать, стоит показать его. Я не нашел никакого рабочего примера для WLAN... если вы, пожалуйста, дайте мне возможность начать с ним.