.NET 3.x TCP Клиент-Сервер, передача файлов, упрощение кода - C#

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

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

TCP Клиент Сервер передача файлов упрощение Вот стартовый пример передачи файлов , я нашкрябал Раклями своими от клиента серверу Сервер консольный
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication_Server
{
    class Program
    {
        private static TcpListener listner;

        private const int MAXBUFFER = 1048576;
        private const int LENGTHHEADER = 9;
        private byte[] buffer;
        private static Stream strLocal;
        private MemoryStream ms;
        private static NetworkStream strRemote;
        private BinaryFormatter bf;
        private static Thread threaddown;
        // Удобный контейнер для подключенного клиента.
        private TcpClient _tcpClient;
 
        static void Main(string[] args)
        {
            Title_Console("Сервер Файлов v1.0");
            string ip = "127.0.0.1";
            Int32 port = 11000;
            try
            {
 
                if (listner == null)
                {
                    listner = new TcpListener(new IPEndPoint(IPAddress.Parse(ip), port));
                    listner.Start();
 
                    //поток
                    threaddown = new Thread(StartReceiving);
                    
                    Console.WriteLine("Сервер Запущен!");
                }

            }
            catch (Exception e)
            {
                listner.Stop();
                listner = null;
                Console.WriteLine(e.Message);
            }
            Console.ReadKey(true);
        }
 
        private static int PercentProgress;
        private void UpdateProgress(Int64 BytesRead, Int64 TotalBytes)
        {
            if (TotalBytes > 0)
            {
                
                // Calculate the download progress in percentages
                PercentProgress = Convert.ToInt32((BytesRead * 100) / TotalBytes);
                // Make progress on the progress bar
                //prgDownload.Value = PercentProgress;
                Console.WriteLine("Progress: "+PercentProgress);
            }
        }

        private static void StartReceiving()
        {
            // There are many lines in here that can cause an exception
            try
            {

                // Write the status to the log textbox on the form (txtLog)
                //this.Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[] { "Starting the server...\r\n" });
                // Start the TCP listener and listen for connections
                // Write the status to the log textbox on the form (txtLog)
                //this.Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[] { "The server has started. Please connect the client to " + ipaLocal.ToString() + "\r\n" });
                // Accept a pending connection
                TcpClient tclServer = listner.AcceptTcpClient();
                // Write the status to the log textbox on the form (txtLog)
                //this.Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[] { "The server has accepted the client\r\n" });
                // Receive the stream and store it in a NetworkStream object
                strRemote = tclServer.GetStream();
                // Write the status to the log textbox on the form (txtLog)
                //this.Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[] { "The server has received the stream\r\n" });
 
                // For holding the number of bytes we are reading at one time from the stream
                int bytesSize = 0;
 
                // The buffer that holds the data received from the client
                byte[] downBuffer = new byte[2048];
                // Read the first buffer (2048 bytes) from the stream - which represents the file name
                bytesSize = strRemote.Read(downBuffer, 0, 2048);
                // Convert the stream to string and store the file name
                string FileName = System.Text.Encoding.ASCII.GetString(downBuffer, 0, bytesSize);
                // Set the file stream to the path C:\ plus the name of the file that was on the sender's computer
                strLocal = new FileStream(@"C:" + FileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
 
                // The buffer that holds the data received from the client
                downBuffer = new byte[2048];
                // Read the next buffer (2048 bytes) from the stream - which represents the file size
                bytesSize = strRemote.Read(downBuffer, 0, 2048);
                // Convert the file size from bytes to string and then to long (Int64)
                long FileSize = Convert.ToInt64(System.Text.Encoding.ASCII.GetString(downBuffer, 0, bytesSize));
 
                // Write the status to the log textbox on the form (txtLog)
                //this.Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[] { "Receiving file " + FileName + " (" + FileSize + " bytes)\r\n" });
 
                // The buffer size for receiving the file
                downBuffer = new byte[2048];
 
                // From now on we read everything that's in the stream's buffer because the file content has started
                while ((bytesSize = strRemote.Read(downBuffer, 0, downBuffer.Length)) > 0)
                {
                    // Write the data to the local file stream
                    strLocal.Write(downBuffer, 0, bytesSize);
                    // Update the progressbar by passing the file size and how much we downloaded so far to UpdateProgress()
                    //this.Invoke(new UpdateProgressCallback(this.UpdateProgress), new object[] { strLocal.Length, FileSize });
                }
                // When this point is reached, the file has been received and stored successfuly
            }
            finally
            {
                // This part of the method will fire no matter wether an error occured in the above code or not
 
                // Write the status to the log textbox on the form (txtLog)
                //this.Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[] { "The file was received. Closing streams.\r\n" });
 
                // Close the streams
                strLocal.Close();
                strRemote.Close();
 
                // Write the status to the log textbox on the form (txtLog)
                //this.Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[] { "Streams are now closed.\r\n" });
 
                // Start the server (TCP listener) all over again
                StartReceiving();
            }
        }

        private static void Title_Console(string title)
        {
            Console.BackgroundColor=ConsoleColor.DarkCyan;
            Console.Clear();
            Console.ForegroundColor=ConsoleColor.White;
            Console.Title = title;
        }
 
        private static void Error_Message(string msg)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(msg);
            Console.ForegroundColor = ConsoleColor.White;
        }

        /// <summary>
        /// Отключение клиента от сервера
        /// </summary>
        public void DisconnectClient()
        {
            strRemote.Close();
            strLocal.Close();
            
            _tcpClient.Close();
        }
 
        /// <summary>
        /// Завершение работы подключенного клиента
        /// </summary>
        private void DeleteClient()
        {
            if (_tcpClient != null && _tcpClient.Connected == true)
            {
                _tcpClient.GetStream().Close(); // по настоянию MSDN закрываем поток отдельно у клиента
                _tcpClient.Close(); // затем закрываем самого клиента
            }
        }

    }

}
Клиент WinForm
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Windows.Forms;
using Security_file_link;
 
namespace WindowsFormsApplication_Server_Files
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        DialogInfo dialog=new DialogInfo();
        //Server_Client_Files_Send serverClient=new Server_Client_Files_Send();
 
        private string path_tmp { get; set; }
        private void button1_Click(object sender, EventArgs e)
        {
            string path = dialog.openfiledialog("files|*.*", "Выбрать файл", "");
            label1.Text = Path.GetFileName(path);
            path_tmp = path;
        }

        // The TCP client will connect to the server using an IP and a port
        TcpClient tcpClient;
        // The file stream will read bytes from the local file you are sending
        FileStream fstFile;
        // The network stream will send bytes to the server application
        NetworkStream strRemote;
 
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                tcpClient = new TcpClient();
               
                IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000);
                tcpClient.Connect(ipEndPoint);
 
                label2.Text = "Connect Server...";
            }
            catch (Exception ex)
            {
                
                MessageBox.Show("ERROR: "+ex.Message,"ERROR",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
            }
 
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            label2.Text = "Send File";
            strRemote = tcpClient.GetStream();
            byte[] byteSend = new byte[tcpClient.ReceiveBufferSize];
            // The file stream will read bytes from the file that the user has chosen
            fstFile = new FileStream(path_tmp, FileMode.Open, FileAccess.Read);
            // Read the file as binary
            BinaryReader binFile = new BinaryReader(fstFile);
 
            // Get information about the opened file
            FileInfo fInfo = new FileInfo(path_tmp);
 
            // Get and store the file name
            string FileName = fInfo.Name;
            // Store the file name as a sequence of bytes
            byte[] ByteFileName = new byte[2048];
            ByteFileName = System.Text.Encoding.ASCII.GetBytes(FileName.ToCharArray());
            // Write the sequence of bytes (the file name) to the network stream
            strRemote.Write(ByteFileName, 0, ByteFileName.Length);
 
            // Get and store the file size
            long FileSize = fInfo.Length;
            // Store the file size as a sequence of bytes
            byte[] ByteFileSize = new byte[2048];
            ByteFileSize = System.Text.Encoding.ASCII.GetBytes(FileSize.ToString().ToCharArray());
            // Write the sequence of bytes (the file size) to the network stream
            strRemote.Write(ByteFileSize, 0, ByteFileSize.Length);
 
            label2.Text += "Sending the file " + FileName + " (" + FileSize + " bytes)\r\n";
 
            // Reset the number of read bytes
            int bytesSize = 0;
            // Define the buffer size
            byte[] downBuffer = new byte[2048];
 
            // Loop through the file stream of the local file
            while ((bytesSize = fstFile.Read(downBuffer, 0, downBuffer.Length)) > 0)
            {
                // Write the data that composes the file to the network stream
                strRemote.Write(downBuffer, 0, bytesSize);
            }
 
            // Update the log textbox and close the connections and streams
            label2.Text += "File sent. Closing streams and connections.\r\n";
            tcpClient.Close();
            strRemote.Close();
            fstFile.Close();
            label2.Text += "Streams and connections are now closed.\r\n";
        }

        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
    }
}
К сожалению происходит зависание передачи есть тоже хороший пример передачи файлов http://www.interestprograms.ru/sourc...ov-po-seti-tcp но если его разбирать он как клубок связан сам с собой сложно а очень хочется простой пример передачи файлов от клиента к серверу и наоборот от сервера к клиенту в примере http://www.interestprograms.ru/sourc...ov-po-seti-tcp Используеться класс MemoryStream ? не понятно зачем он там нужен , если достаточно просто Stream товарищи подкинте что то, или как правильно

Решение задачи: «.NET 3.x TCP Клиент-Сервер, передача файлов, упрощение кода»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
 
namespace SERVER_FILES_TEST
{
    class Program
    {
        static TcpListener listner;
 
        //Потоки
        private static NetworkStream strRemote;
        private static BinaryReader br;
        private static BinaryWriter bw;
        private static MemoryStream memoryStream;
 
        static void Main(string[] args)
        {
            Title_Console("Сервер Файлов");
            try
            {
                string ipstr = "127.0.0.1", portstr = "9050";
                IPAddress ip = IPAddress.Parse(ipstr);
                Int32 port = Convert.ToInt32(portstr);
                
                
                IPEndPoint ipEndPoints = new IPEndPoint(ip, port);
 
                Message_Console("IP: "+ip);
                Message_Console("PORT: "+port);
 
                listner = new TcpListener(ipEndPoints);
                //запуск сервера
                listner.Start();
 
                Message_Console("Сервер запущен...");
 
                //бесконеыный цикл приема и ответа
                while (true)
                {
                    string msg_client = string.Empty;
                    TcpClient client = listner.AcceptTcpClient();
 
                    //потоки обявляем
                    strRemote = client.GetStream();
                    br = new BinaryReader(strRemote);
                    bw = new BinaryWriter(strRemote);
 
                    //получаем от клиента
                    msg_client = Get_msg();
                    Message_Console("Клиент: "+msg_client);
                    Get_file(msg_client);
 
                    //отправить клиенту
                    Console.Write("Server: ");
                    Set_msg(Console.ReadLine());
                }
 
 
            }
            catch (Exception ex)
            {
                Disconect_server();
                Error_Message(ex.Message);
            }
        }
 
        //отправляем
        private static void Set_file()
        {
            
        }
 
 
        private static void Set_msg(string msg)
        {
            bw.Write(msg);
        }
 
        //получаем
        private static string Get_msg()
        {
            return br.ReadString();
        }
 
        private static void Get_file(string filename)
        {
            int bytesSize = 0;
            byte[] buffer = new byte[2048];
            try
            {
                //buffer = br.ReadBytes(0);
                bytesSize = strRemote.Read(buffer, 0, 2048);
 
                //поток файла
                Stream strLocal = new FileStream(@"C:" + filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
 
                //размер файла
                long FileSize = Convert.ToInt64(System.Text.Encoding.ASCII.GetString(buffer, 0, bytesSize));
 
                while ((bytesSize = strRemote.Read(buffer, 0, buffer.Length)) > 0)
                {
                    // Write the data to the local file stream
                    strLocal.Write(buffer, 0, bytesSize);
                    // Update the progressbar by passing the file size and how much we downloaded so far to UpdateProgress()
                }
 
                Message_Console("Загрузка " + filename + " завершена!");
            }
            catch (Exception ex)
            {
                
                Error_Message(ex.Message);
            }
        }
 
        //отключаем
        private static void Disconect_server()
        {
            strRemote.Close();
            br.Close();
            bw.Close();
            memoryStream.Close();
            listner.Stop();
        }
 
 
 
        /////////////////Краска, Титулка, Паузы////////////////////////////
        static void Title_Console(string title)
        {
            Console.BackgroundColor=ConsoleColor.DarkCyan;
            Console.Clear();
            Console.ForegroundColor=ConsoleColor.White;
            Console.Title = title;
        }
 
        static void Pause()
        {
            Console.ReadKey(true);
        }
 
 
        static void Message_Console(string msg)
        {
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine(msg);
            Console.ForegroundColor = ConsoleColor.White;
        }
 
        static void Error_Message(string msg)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(msg);
            Console.ForegroundColor = ConsoleColor.White;
        }
        ////////////////////////////////////////////////////////////////////
    }
}

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


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

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

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