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

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

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

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

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

textual
Листинг программы
namespace Peredacha
{
    public partial class Form1 : Form
    {
        String IP;
        int combo;
        public Form1()
        {
            InitializeComponent();
            //Создаем поток для приема сообщений
            new Thread(new ThreadStart(Receiver)).Start();
            new Thread(new ThreadStart(FileReceiver)).Start();
        }
        //Метод потока
        protected void Receiver()
        {
            //Создаем Listener на порт "по умолчанию"
            TcpListener Listen = new TcpListener(7000);
            //Начинаем прослушку
            Listen.Start();
            //и заведем заранее сокет
            Socket ReceiveSocket;
            while (true)
            {
                try
                {
                    //Пришло сообщение
                    ReceiveSocket = Listen.AcceptSocket();
                    Byte[] Receive = new Byte[256];
                    //Читать сообщение будем в поток
                    using (MemoryStream MessageR = new MemoryStream())
                    {
                        //Количество считанных байт
                        Int32 ReceivedBytes;
                        do
                        {//Собственно читаем
                            ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0);
                            //и записываем в поток
                            MessageR.Write(Receive, 0, ReceivedBytes);
                            //Читаем до тех пор, пока в очереди не останется данных
                        } while (ReceiveSocket.Available > 0);
                        //Добавляем изменения в ChatBox
                        ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Получаю: " + Encoding.Default.GetString(MessageR.ToArray()), ChatBox });    
                    }
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
 
        //Метод потока
        protected void FileReceiver()
        {
            //Создаем Listener на порт "по умолчанию"
            TcpListener Listen = new TcpListener(6999);
            //Начинаем прослушку
            Listen.Start();
            //и заведем заранее сокет
            Socket ReceiveSocket;
            while (true)
            {
                try
                {
                    string name;
                    //Пришло сообщение
                    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;
                                    //В случае если было принято >256 байт (двумя сообщениями к примеру)
                                    //Остаток (до 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[] { "Получено: " + resFilePath, ChatBox });
                        name = resFilePath;
                    }
}
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
 
        /// <summary>
        /// Отправляет сообщение в потоке на IP, заданный в контроле IP
        /// </summary>
        /// <param name="Message">Передаваемое сообщение</param>
        void ThreadSend(object Message)
        {
            try
            {
                //Проверяем входной объект на соответствие строке
                String MessageText = "";
                if (Message is String)
                {
                    MessageText = Message as String;
                }
                else
                    throw new Exception("На вход необходимо подавать строку");
 
                Byte[] SendBytes = Encoding.Default.GetBytes(MessageText);
                //Создаем сокет, коннектимся
                IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse(IP), 7000);
                Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                Connector.Connect(EndPoint);
                Connector.Send(SendBytes);
                Connector.Close();
                //Изменяем поле сообщений (уведомляем, что отправили сообщение)
                ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Отправлено " + MessageText, ChatBox });
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        //Делегат доступа к контролам формы
        delegate void SendMsg(String Text, RichTextBox Rtb);
        SendMsg AcceptDelegate = (String Text, RichTextBox Rtb) =>
        {
            Rtb.Text += Text + "\n";
        };
 
        private void button1_Click(object sender, EventArgs e)
        {
            IP = comboBox1.Text;
            Ping ping = new Ping();
            PingReply reply = ping.Send(IP);
            if (reply.Status != IPStatus.Success)
            {
                MessageBox.Show("Не удаётся подключиться!");
                button2.Enabled = false;
            }
            else {
                button2.Enabled = true;
                //Отправляем файл
                //Добавим на форму OpenFileDialog и вызовем его
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    //Коннектимся
                    IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse(IP), 6999);
                    Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                    Connector.Connect(EndPoint);
                    //Получаем имя из полного пути к файлу
                    StringBuilder FileName = new StringBuilder(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();
                }
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            new Thread(new ParameterizedThreadStart(ThreadSend)).Start("Получение"); //otpravka
        }
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            Environment.Exit(0);
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
           
        }
        private void button3_Click(object sender, EventArgs e)
        {
            panel2.Visible = false;
        }
 
        private void button3_Click_1(object sender, EventArgs e)
        {
            panel2.Visible = false;
            IP1.Text = ""; IP2.Text = ""; IP3.Text = ""; IP4.Text = "";
            textBox1.Text = "";
        }
 
        private void IP1_TextChanged(object sender, EventArgs e)
        {
            String a;
            int f;
            a = IP1.Text;
            try
            {
                f = int.Parse(a);
                for (int i = 0; i <= 10; i++)
                {
                    if (f == i) { a = i.ToString(); }
                }
            }
            catch
            {
                if (IP1.Text != "") { MessageBox.Show("Не верный символ!"); IP1.Text = ""; }
            }
        }
 
        private void IP2_TextChanged(object sender, EventArgs e)
        {
            String a;
            int f;
            a = IP2.Text;
            try
            {
                f = int.Parse(a);
                for (int i = 0; i <= 10; i++)
                {
                    if (f == i) { a = i.ToString(); }
                }
            }
            catch
            {
                if (IP2.Text != "") { MessageBox.Show("Не верный символ!"); IP2.Text = ""; }
            }
        }
 
        private void IP3_TextChanged(object sender, EventArgs e)
        {
            String a;
            int f;
            a = IP3.Text;
            try
            {
                f = int.Parse(a);
                for (int i = 0; i <= 10; i++)
                {
                    if (f == i) { a = i.ToString(); }
                }
            }
            catch
            {
                if (IP3.Text != "") { MessageBox.Show("Не верный символ!"); IP3.Text = ""; }
            }
        }
 
        private void IP4_TextChanged(object sender, EventArgs e)
        {
            String a;
            int f;
            a = IP4.Text;
            try
            {
                f = int.Parse(a);
                for (int i = 0; i <= 10; i++)
                {
                    if (f == i) { a = i.ToString(); }
                }
            }
            catch
            {
                if (IP4.Text != "") { MessageBox.Show("Не верный символ!"); IP4.Text = ""; }
            }
        }
    }
}

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


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

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

12   голосов , оценка 3.917 из 5
Похожие ответы