Передача файлов без потерь - C#
Формулировка задачи:
Всем привет! Подскажите каким образом организовать передачу файлов по локалке без потерь(протокол TCP)?
Есть у меня код по передаче файлов, мелкие файлы (примерно до 20 мб) передаёт нормально, а вот побольше которые, идут с потерями.
Сервер:
Клиент:
Листинг программы
- protected void FileReceiver()
- {
- string myHost = System.Net.Dns.GetHostName();
- string myIP = System.Net.Dns.GetHostByName(myHost).AddressList[0].ToString();
- IPAddress localAddr = IPAddress.Parse(myIP);
- TcpListener Listen = new TcpListener(localAddr, 6999);
- Listen.Start();
- Socket ReceiveSocket;
- while (true)
- {
- try
- {
- ReceiveSocket = Listen.AcceptSocket();
- Byte[ ] Receive = new Byte[ 256];
- using (MemoryStream MessageR = new MemoryStream())
- {
- Int32 ReceivedBytes;
- Int32 Firest256Bytes = 0 ;
- String FilePath = "" ;
- do
- {
- ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0 );
- //Разбираем первые 256 байт
- if (Firest256Bytes < 256 )
- {
- Firest256Bytes += ReceivedBytes;
- Byte[ ] ToStr = Receive;
- if (Firest256Bytes > 256 )
- {
- Int32 Start = Firest256Bytes - ReceivedBytes;
- Int32 CountToGet = 256 - Start;
- Firest256Bytes = 256 ;
- ToStr = Receive.Take(CountToGet).ToArray();
- Receive = Receive.Skip(CountToGet).ToArray();
- MessageR.Write(Receive, 0 , ReceivedBytes);
- }
- FilePath += Encoding.Default.GetString(ToStr);
- } else
- MessageR.Write(Receive, 0 , ReceivedBytes);
- } while (ReceivedBytes == Receive.Length);
- String resFilePath = FilePath.Substring(0, FilePath.IndexOf("\0" ));
- using (var File = new FileStream(resFilePath, FileMode.Create))
- {
- File.Write(MessageR.ToArray(), 0 , MessageR.ToArray().Length);
- }
- ChatBox.BeginInvoke(AcceptDelegate, new object[ ] { "Received: " + resFilePath, ChatBox });
- }
- }
- catch (System.Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
- }
Листинг программы
- private void button3_Click(object sender, EventArgs e)
- {
- if (openFileDialog1.ShowDialog() == DialogResult.OK)
- {
- IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse(IP.Text), 6999);
- Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
- Connector.Connect(EndPoint);
- StringBuilder FileName = new StringBuilder(openFileDialog1.FileName);
- MessageBox.Show(openFileDialog1.FileName);
- int index = FileName.Length - 1;
- while (FileName[index] != '\\' && FileName[index] != '/')
- {
- index--;
- }
- String resFileName = "";
- for (int i = index + 1; i < FileName.Length; i++)
- resFileName += FileName[i];
- List<Byte> First256Bytes = Encoding.Default.GetBytes(resFileName).ToList();
- Int32 Diff = 256 - First256Bytes.Count;
- for (int i = 0; i < Diff; i++)
- First256Bytes.Add(0);
- Byte[] ReadedBytes = new Byte[256];
- using (var FileStream = new FileStream(openFileDialog1.FileName, FileMode.Open))
- {
- using (var Reader = new BinaryReader(FileStream))
- {
- Int32 CurrentReadedBytesCount;
- Connector.Send(First256Bytes.ToArray());
- do
- {
- CurrentReadedBytesCount = Reader.Read(ReadedBytes, 0, ReadedBytes.Length);
- Connector.Send(ReadedBytes, CurrentReadedBytesCount, SocketFlags.None);
- }
- while (CurrentReadedBytesCount == ReadedBytes.Length);
- }
- }
- Connector.Close();
- }
- }
Люди, кто понимает подскажите как организовать это без потерь. Код переправлять не надо, я сам всё сделаю, просто дайте совет!
Решение задачи: «Передача файлов без потерь»
textual
Листинг программы
- string fileName = Encoding.UTF8.GetString(first256Bytes, 0, Array.IndexOf(first256Bytes, 0));
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д