Приложение для передачи файлов + локальный чат - 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 = ""; }
}
}
}
}