Приложение для передачи файлов + локальный чат - 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 = ""; }
- }
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д