Приложение для передачи файлов + локальный чат - C#

Узнай цену своей работы

Формулировка задачи:

Есть приложение для отправки и получения файлов по локальной сети. На сокетах. Нашёл готовое и думал перебрать под себя. Полностью перевернул код и перенёс в свою программу. Сейчас, во время тестирования обнаружил, что программа не передаёт больших файлов. Вот программа Передача файлов.rar Программу брал тут http://xnim.ru/blog?id=29Сегодня обнаружил похожую тему тут Чат локальной сети. Передача больших файлов Посоветуйте пожалуйста как сделать!

Решение задачи: «Приложение для передачи файлов + локальный чат»

textual
Листинг программы
  1. namespace Peredacha
  2. {
  3.     public partial class Form1 : Form
  4.     {
  5.         String IP;
  6.         int combo;
  7.         public Form1()
  8.         {
  9.             InitializeComponent();
  10.             //Создаем поток для приема сообщений
  11.             new Thread(new ThreadStart(Receiver)).Start();
  12.             new Thread(new ThreadStart(FileReceiver)).Start();
  13.         }
  14.         //Метод потока
  15.         protected void Receiver()
  16.         {
  17.             //Создаем Listener на порт "по умолчанию"
  18.             TcpListener Listen = new TcpListener(7000);
  19.             //Начинаем прослушку
  20.             Listen.Start();
  21.             //и заведем заранее сокет
  22.             Socket ReceiveSocket;
  23.             while (true)
  24.             {
  25.                 try
  26.                 {
  27.                     //Пришло сообщение
  28.                     ReceiveSocket = Listen.AcceptSocket();
  29.                     Byte[] Receive = new Byte[256];
  30.                     //Читать сообщение будем в поток
  31.                     using (MemoryStream MessageR = new MemoryStream())
  32.                     {
  33.                         //Количество считанных байт
  34.                         Int32 ReceivedBytes;
  35.                         do
  36.                         {//Собственно читаем
  37.                             ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0);
  38.                             //и записываем в поток
  39.                             MessageR.Write(Receive, 0, ReceivedBytes);
  40.                             //Читаем до тех пор, пока в очереди не останется данных
  41.                         } while (ReceiveSocket.Available > 0);
  42.                         //Добавляем изменения в ChatBox
  43.                         ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Получаю: " + Encoding.Default.GetString(MessageR.ToArray()), ChatBox });    
  44.                     }
  45.                 }
  46.                 catch (System.Exception ex)
  47.                 {
  48.                     MessageBox.Show(ex.Message);
  49.                 }
  50.             }
  51.         }
  52.  
  53.         //Метод потока
  54.         protected void FileReceiver()
  55.         {
  56.             //Создаем Listener на порт "по умолчанию"
  57.             TcpListener Listen = new TcpListener(6999);
  58.             //Начинаем прослушку
  59.             Listen.Start();
  60.             //и заведем заранее сокет
  61.             Socket ReceiveSocket;
  62.             while (true)
  63.             {
  64.                 try
  65.                 {
  66.                     string name;
  67.                     //Пришло сообщение
  68.                     ReceiveSocket = Listen.AcceptSocket();
  69.                     Byte[] Receive = new Byte[256];
  70.                     //Читать сообщение будем в поток
  71.                     using (MemoryStream MessageR = new MemoryStream())
  72.                     {
  73.                         //Количество считанных байт
  74.                         Int32 ReceivedBytes;
  75.                         Int32 Firest256Bytes = 0;
  76.                         String FilePath = "";
  77.                         do
  78.                         {//Собственно читаем
  79.                             ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0);
  80.                             //Разбираем первые 256 байт
  81.                             if (Firest256Bytes < 256)
  82.                             {
  83.                                 Firest256Bytes += ReceivedBytes;
  84.                                 Byte[] ToStr = Receive;
  85.                                 //Учтем, что может возникнуть ситуация, когда они не могу передаться "сразу" все
  86.                                 if (Firest256Bytes > 256)
  87.                                 {
  88.                                     Int32 Start = Firest256Bytes - ReceivedBytes;
  89.                                     Int32 CountToGet = 256 - Start;
  90.                                     Firest256Bytes = 256;
  91.                                     //В случае если было принято >256 байт (двумя сообщениями к примеру)
  92.                                     //Остаток (до 256) записываем в "путь файла"
  93.                                     ToStr = Receive.Take(CountToGet).ToArray();
  94.                                     //А остальную часть - в будующий файл
  95.                                     Receive = Receive.Skip(CountToGet).ToArray();
  96.                                     MessageR.Write(Receive, 0, ReceivedBytes);
  97.                                 }
  98.                                 //Накапливаем имя файла
  99.                                 FilePath += Encoding.Default.GetString(ToStr);
  100.                             }
  101.                             else
  102.                                 //и записываем в поток
  103.                                 MessageR.Write(Receive, 0, ReceivedBytes);
  104.                             //Читаем до тех пор, пока в очереди не останется данных
  105.                         } while (ReceivedBytes == Receive.Length);
  106.                         //Убираем лишние байты
  107.                         String resFilePath = FilePath.Substring(0, FilePath.IndexOf('\0'));
  108.                         using (var File = new FileStream(resFilePath, FileMode.Create))
  109.                         {//Записываем в файл
  110.                             File.Write(MessageR.ToArray(), 0, MessageR.ToArray().Length);
  111.                         }//Уведомим пользователя
  112.                         ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Получено: " + resFilePath, ChatBox });
  113.                         name = resFilePath;
  114.                     }
  115. }
  116.                 catch (System.Exception ex)
  117.                 {
  118.                     MessageBox.Show(ex.Message);
  119.                 }
  120.             }
  121.         }
  122.  
  123.         /// <summary>
  124.         /// Отправляет сообщение в потоке на IP, заданный в контроле IP
  125.         /// </summary>
  126.         /// <param name="Message">Передаваемое сообщение</param>
  127.         void ThreadSend(object Message)
  128.         {
  129.             try
  130.             {
  131.                 //Проверяем входной объект на соответствие строке
  132.                 String MessageText = "";
  133.                 if (Message is String)
  134.                 {
  135.                     MessageText = Message as String;
  136.                 }
  137.                 else
  138.                     throw new Exception("На вход необходимо подавать строку");
  139.  
  140.                 Byte[] SendBytes = Encoding.Default.GetBytes(MessageText);
  141.                 //Создаем сокет, коннектимся
  142.                 IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse(IP), 7000);
  143.                 Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
  144.                 Connector.Connect(EndPoint);
  145.                 Connector.Send(SendBytes);
  146.                 Connector.Close();
  147.                 //Изменяем поле сообщений (уведомляем, что отправили сообщение)
  148.                 ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Отправлено " + MessageText, ChatBox });
  149.             }
  150.             catch (Exception ex)
  151.             {
  152.                 MessageBox.Show(ex.Message);
  153.             }
  154.         }
  155.  
  156.         //Делегат доступа к контролам формы
  157.         delegate void SendMsg(String Text, RichTextBox Rtb);
  158.         SendMsg AcceptDelegate = (String Text, RichTextBox Rtb) =>
  159.         {
  160.             Rtb.Text += Text + "\n";
  161.         };
  162.  
  163.         private void button1_Click(object sender, EventArgs e)
  164.         {
  165.             IP = comboBox1.Text;
  166.             Ping ping = new Ping();
  167.             PingReply reply = ping.Send(IP);
  168.             if (reply.Status != IPStatus.Success)
  169.             {
  170.                 MessageBox.Show("Не удаётся подключиться!");
  171.                 button2.Enabled = false;
  172.             }
  173.             else {
  174.                 button2.Enabled = true;
  175.                 //Отправляем файл
  176.                 //Добавим на форму OpenFileDialog и вызовем его
  177.                 if (openFileDialog1.ShowDialog() == DialogResult.OK)
  178.                 {
  179.                     //Коннектимся
  180.                     IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse(IP), 6999);
  181.                     Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
  182.                     Connector.Connect(EndPoint);
  183.                     //Получаем имя из полного пути к файлу
  184.                     StringBuilder FileName = new StringBuilder(openFileDialog1.FileName);
  185.                     //Выделяем имя файла
  186.                     int index = FileName.Length - 1;
  187.                     while (FileName[index] != '\\' && FileName[index] != '/')
  188.                     {
  189.                         index--;
  190.                     }
  191.                     //Получаем имя файла
  192.                     String resFileName = "";
  193.                     for (int i = index + 1; i < FileName.Length; i++)
  194.                         resFileName += FileName[i];
  195.                     //Записываем в лист
  196.                     List<Byte> First256Bytes = Encoding.Default.GetBytes(resFileName).ToList();
  197.                     Int32 Diff = 256 - First256Bytes.Count;
  198.                     //Остаток заполняем нулями
  199.                     for (int i = 0; i < Diff; i++)
  200.                         First256Bytes.Add(0);
  201.                     //Начинаем отправку данных
  202.                     Byte[] ReadedBytes = new Byte[256];
  203.                     using (var FileStream = new FileStream(openFileDialog1.FileName, FileMode.Open))
  204.                     {
  205.                         using (var Reader = new BinaryReader(FileStream))
  206.                         {
  207.                             Int32 CurrentReadedBytesCount;
  208.                             //Вначале отправим название файла
  209.                             Connector.Send(First256Bytes.ToArray());
  210.                             do
  211.                             {
  212.                                 //Затем по частям - файл
  213.                                 CurrentReadedBytesCount = Reader.Read(ReadedBytes, 0, ReadedBytes.Length);
  214.                                 Connector.Send(ReadedBytes, CurrentReadedBytesCount, SocketFlags.None);
  215.                             }
  216.                             while (CurrentReadedBytesCount == ReadedBytes.Length);
  217.                         }
  218.                     }
  219.                     //Завершаем передачу данных
  220.                     Connector.Close();
  221.                 }
  222.             }
  223.         }
  224.  
  225.         private void button2_Click(object sender, EventArgs e)
  226.         {
  227.             new Thread(new ParameterizedThreadStart(ThreadSend)).Start("Получение"); //otpravka
  228.         }
  229.  
  230.         private void Form1_FormClosed(object sender, FormClosedEventArgs e)
  231.         {
  232.             Environment.Exit(0);
  233.         }
  234.  
  235.         private void Form1_Load(object sender, EventArgs e)
  236.         {
  237.            
  238.         }
  239.         private void button3_Click(object sender, EventArgs e)
  240.         {
  241.             panel2.Visible = false;
  242.         }
  243.  
  244.         private void button3_Click_1(object sender, EventArgs e)
  245.         {
  246.             panel2.Visible = false;
  247.             IP1.Text = ""; IP2.Text = ""; IP3.Text = ""; IP4.Text = "";
  248.             textBox1.Text = "";
  249.         }
  250.  
  251.         private void IP1_TextChanged(object sender, EventArgs e)
  252.         {
  253.             String a;
  254.             int f;
  255.             a = IP1.Text;
  256.             try
  257.             {
  258.                 f = int.Parse(a);
  259.                 for (int i = 0; i <= 10; i++)
  260.                 {
  261.                     if (f == i) { a = i.ToString(); }
  262.                 }
  263.             }
  264.             catch
  265.             {
  266.                 if (IP1.Text != "") { MessageBox.Show("Не верный символ!"); IP1.Text = ""; }
  267.             }
  268.         }
  269.  
  270.         private void IP2_TextChanged(object sender, EventArgs e)
  271.         {
  272.             String a;
  273.             int f;
  274.             a = IP2.Text;
  275.             try
  276.             {
  277.                 f = int.Parse(a);
  278.                 for (int i = 0; i <= 10; i++)
  279.                 {
  280.                     if (f == i) { a = i.ToString(); }
  281.                 }
  282.             }
  283.             catch
  284.             {
  285.                 if (IP2.Text != "") { MessageBox.Show("Не верный символ!"); IP2.Text = ""; }
  286.             }
  287.         }
  288.  
  289.         private void IP3_TextChanged(object sender, EventArgs e)
  290.         {
  291.             String a;
  292.             int f;
  293.             a = IP3.Text;
  294.             try
  295.             {
  296.                 f = int.Parse(a);
  297.                 for (int i = 0; i <= 10; i++)
  298.                 {
  299.                     if (f == i) { a = i.ToString(); }
  300.                 }
  301.             }
  302.             catch
  303.             {
  304.                 if (IP3.Text != "") { MessageBox.Show("Не верный символ!"); IP3.Text = ""; }
  305.             }
  306.         }
  307.  
  308.         private void IP4_TextChanged(object sender, EventArgs e)
  309.         {
  310.             String a;
  311.             int f;
  312.             a = IP4.Text;
  313.             try
  314.             {
  315.                 f = int.Parse(a);
  316.                 for (int i = 0; i <= 10; i++)
  317.                 {
  318.                     if (f == i) { a = i.ToString(); }
  319.                 }
  320.             }
  321.             catch
  322.             {
  323.                 if (IP4.Text != "") { MessageBox.Show("Не верный символ!"); IP4.Text = ""; }
  324.             }
  325.         }
  326.     }
  327. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы