Программа по оптимизации передачи данных через сервер

Автор работы: Пользователь скрыл имя, 20 Августа 2013 в 23:24, дипломная работа

Описание работы

Актуальность моей работы заключается в создании инструмента для разработки приложений, связанных между собой по сети и работающих как единая система.
Сейчас распространена клиент-серверная сетевая архитектура, в которой задания или сетевая нагрузка распределены между поставщиками услуг (сервисов), называемыми серверами, и заказчиками услуг, называемыми клиентами. Нередко клиенты и серверы взаимодействуют через компьютерную сеть и могут быть как различными физическими устройствами, так и программным обеспечением.

Содержание работы

Введение 3
Глава 1. Оптимизация приложений 6
1.1 Механизмы оптимизации 6
1.2 Архитектурный принцип построения сетей 9
1.3 Пропускная способность сети 11
1.4 Поток данных 12
1.5 Гибридные сети 20
1.6 Брэндмауэр Windows 22
1.7 Отличие С# от Java 24
1.8 JSON. Передача объектов 36
Глава 2. Программная часть 38
2.1 Среда разработки 38
2.2 Язык программирования 39
2.3 Диаграммы классов 40
2.4 Диаграммы взаимодействия 43
2.5 Алгоритм работы 45
2.6 Интерфейс приложения 47
Заключение 49
Список использованной литературы 50

Файлы: 1 файл

Диплом.docx

— 1.24 Мб (Скачать файл)

 

Заключение

Актуальность  моей работы заключается в создании инструмента для разработки приложений, связанных между собой по сети и работающих как единая система.

Предмет исследования – возможность разгрузки сервера  в данной архитектуре, автономность работы клиента в случае отказа сервера  и его   обособленность от передаваемых данных между клиентами.

Был написан  класс NetClient, в котором вообще нет привязки к сетевым компонентам, за всю работу с сетью отвечает NetClient. Он обладает методами синхронной передачи массива байт, синхронного приема массива с последующим вызовом метода обработчика и двумя методами приема\передачи файлов выполняющимися в фоновом режиме.

Использование данного класса при написании сетевого приложения позволит значительно разгрузить сервер.

 

Список использованной литературы

 

Приложение 1. Реализация класса NetClient

using System;

using System.ComponentModel;

using System.IO;

using System.Net;

using System.Net.Sockets;

using System.Text;

using System.Threading;

using Newtonsoft.Json;

using ShareClassLibrary;

 

namespace Client

{

    public class NetClientGetBytesEventArgs : EventArgs

    {

        public byte[] Bytes { get; set; }

        public string IPAdr { get; set; }

 

        public NetClientGetBytesEventArgs(byte[] bytes, string ip)

        {

            Bytes = bytes;

            IPAdr = ip;

        }

    }

 

    static class NetClient

    {

        private static string _serverAddr;

        private static int _serverPort;

        public static event EventHandler<NetClientGetBytesEventArgs> GetBytes;

        private static Socket clientSocket;

        private static TcpListener listener;

        private static bool _isStarted = false;

 

        private static void OnGetBytes(NetClientGetBytesEventArgs eventArgs)

        {

            if (GetBytes != null)

            {

                GetBytes(null, eventArgs);

            }

        }

 

        public static bool SendBytes(string address, int port, byte[] buffer)

        {

            var ipAddresses = Dns.GetHostAddresses(address);

            var endPoint = new IPEndPoint(ipAddresses[0], port);

            return SendBytes(endPoint, buffer);

        }

 

        public static bool SendBytes(ClientInfo clientInfo, byte[] buffer)

        {

            var ipAddresses = Dns.GetHostAddresses(clientInfo.IPAdr);

            var endPoint = new IPEndPoint(ipAddresses[0], clientInfo.Port);

            return SendBytes(endPoint, buffer);

        }

 

        public static bool SendBytes(IPEndPoint endPoint, byte[] buffer)

        {

            var clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try

            {

                clientSocket.Connect(endPoint);

                clientSocket.Send(buffer);

            }

            catch

            {

                return false;

            }

            finally

            {

                clientSocket.Close();

            }

            return true;

        }

 

 

        public static bool ServerConnect(string addres, int serverPort, string name, int localPort)

        {

            _serverAddr = addres;

            _serverPort = serverPort;

 

            var encoding = new UTF8Encoding();

 

            var serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            IPAddress[] ipAddresses = Dns.GetHostAddresses(_serverAddr);

            var serverIP = new IPEndPoint(ipAddresses[0], _serverPort);

            try

            {

                serverSocket.Connect(serverIP);

            }

            catch

            {

                return false;

            }

            var clientRequest = new ClientRequest {Name = name, Port = localPort};

            string jsonRequest = JsonConvert.SerializeObject(clientRequest);

 

            byte[] buffer = encoding.GetBytes(jsonRequest);

            serverSocket.Send(buffer);

 

            serverSocket.Close();

            var thread = new Thread(ReceiveMessages);

            try

            {

                thread.Start(localPort);

            }

            catch

            {

                return false;

            }

           

            return true;

        }

 

        public static void SendStream(string addres, int port, Stream stream, Action<int> onProgress, Action onComplete, CancellationTokenSource token)

        {

            BackgroundWorker worker = new BackgroundWorker();

            worker.DoWork += (sender, args) =>

                {

                    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                    try

                    {

                        socket.Connect(addres, port);

                        using (stream)

                        using (NetworkStream networkStream = new NetworkStream(socket))

                        using (BinaryWriter writer = new BinaryWriter(networkStream))

                        {

                            writer.Write(stream.Length);

 

                            byte[] buffer = new byte[1024*10];

                            long totalBytes = 0;

 

                            do

                            {

                                var readBytes = stream.Read(buffer, 0, buffer.Length);

                                writer.Write(buffer, 0, readBytes);

                                totalBytes += readBytes;

 

                                if (onProgress != null)

                                {

                                    int percent = (int) Math.Round((double) totalBytes/stream.Length*100);

                                    onProgress(percent);

                                }

 

                                if (token.IsCancellationRequested)

                                {

                                    break;

                                }

                            } while (socket.Connected && totalBytes < stream.Length);

                        }

                    }

                    finally

                    {

                        socket.Close();

                        if (onComplete != null)

                            onComplete();

                    }

                };

            worker.RunWorkerAsync();

        }

 

        public static void ReceiveStream(int port, string fileName, Action<int> onProgress, Action onComplete, CancellationTokenSource token)

        {

            BackgroundWorker worker = new BackgroundWorker();

            worker.DoWork += (sender, args) =>

                {

                    var endPoint = new IPEndPoint(IPAddress.Any, port);

                    var listener = new TcpListener(endPoint);

                    listener.Start(1);

                    Socket socket = null;

                    try

                    {

                        socket = listener.AcceptSocket();

 

                        using (NetworkStream networkStream = new NetworkStream(socket))

                        using (BinaryReader reader = new BinaryReader(networkStream))

                        using (FileStream writer = File.Create(fileName))

                        {

                            long totalBytes = 0;

                            long length = reader.ReadInt64();

                            byte[] buffer = new byte[1024*10];

 

                            do

                            {

                                int readBytes = reader.Read(buffer, 0, buffer.Length);

                                writer.Write(buffer, 0, readBytes);

                                totalBytes += readBytes;

 

                                if (onProgress != null)

                                {

                                    int percent = (int) Math.Round((double) totalBytes/length*100);

                                    onProgress(percent);

                                }

 

                                if (token.IsCancellationRequested)

                                {

                                    break;

                                }

                            } while (socket.Connected && totalBytes < length);

                        }

                    }

                    finally

                    {

                        if (socket != null)

                            socket.Close();

                        listener.Stop();

                        if (onComplete != null)

                            onComplete();

                    }

                };

            worker.RunWorkerAsync();

        }

 

        private static void ReceiveMessages(object port)

        {

            if (_isStarted)

                return;

            var localPort = (int) port;

            var localEndPoint = new IPEndPoint(IPAddress.Any, localPort);

            listener = new TcpListener(localEndPoint);

            listener.Start(1);

            _isStarted = true;

            while (listener.Server.IsBound)

            {

                try

                {

                    clientSocket = listener.AcceptSocket();

                    byte[] buffer = new byte[clientSocket.ReceiveBufferSize];

                    clientSocket.ReceiveTimeout = 1000;

                    clientSocket.Receive(buffer);

 

                    string remoteIP = ((IPEndPoint) clientSocket.RemoteEndPoint).Address.ToString();

                    OnGetBytes(new NetClientGetBytesEventArgs(buffer, remoteIP));

                }

                finally

                {

                    if (clientSocket != null && clientSocket.Connected)

                        clientSocket.Close();

                }

            }

        }

 

        internal static void Stop()

        {

            if (clientSocket != null && clientSocket.Connected)

                clientSocket.Close();

            if (listener != null)

                listener.Stop();

            _isStarted = false;

        }

    }

}

 

 

Приложение 2. Реализация Form1.cs

using System.IO;

using Newtonsoft.Json;

using ShareClassLibrary;

using System;

using System.Collections.Generic;

using System.Text;

using System.Windows.Forms;

 

namespace Client

{

    public sealed partial class Form1 : Form

    {

        private readonly SortedList<ClientInfo, ClientPanel> clientPanels = new SortedList<ClientInfo, ClientPanel>();

        private bool receiveFile;

        private string receiveFileName;

 

        public Form1()

        {

            InitializeComponent();

            Text = Settings.MessagePort.ToString();

            textAddress.Text = Settings.ServerHost;

            textPort.Text = Settings.ServerPort.ToString();

        }

 

        #region handlers

 

        private void button1_Click(object sender, EventArgs e)

        {

            NetClient.GetBytes += NetClient_GetBytes;

            int serverPort = int.Parse(textPort.Text);

            try

            {

                NetClient.ServerConnect(textAddress.Text, serverPort, textName.Text, Settings.MessagePort);

            }

            catch (Exception ex)

            {

                MessageBox.Show(this, ex.Message + @"Application terminate");

                Close();

            }

        }

 

        void NetClient_GetBytes(object sender, NetClientGetBytesEventArgs e)

        {

            var encoding = new UTF8Encoding();

            string message = encoding.GetString(e.Bytes);

            ClientMessage clientMessage;

            try

            {

                clientMessage = JsonConvert.DeserializeObject<ClientMessage>(message);

            }

            catch

            {

                return;

            }

 

            //if (clientMessage.Message.StartsWith("##Ping"))

            if (clientMessage == null)

            {

                return;

            }

 

            // список клиентов с сервера, приходит в том случае если на сервере обновилась информация о клиентах

            if (clientMessage.Message.StartsWith("##ClientList:"))

            {

                string JsonMessage = clientMessage.Message.Remove(0, "##ClientList:".Length);

                var clientList = JsonConvert.DeserializeObject<List<ClientInfo>>(JsonMessage);

                ProcessClientList(clientList);

                return;

            }

 

            var clientInfo = new ClientInfo();

            clientInfo.IPAdr = e.IPAdr;

            clientInfo.Port = clientMessage.Port;

 

// для нового клиента  созадется своя панель с историей

            if (!clientPanels.ContainsKey(clientInfo))

            {

                var panel = new ClientPanel(clientPanel, clientInfo);

                clientPanels.Add(clientInfo, panel);

            }

            if (clientPanels.ContainsKey(clientInfo))

            {

                if (clientPanels[clientInfo] == null)

                    clientPanels[clientInfo] = new ClientPanel(clientPanel, clientInfo);

 

// если поступил  запрос от другого клиента  на передачу файла

// выводим диалог  с запросом имени и запускаем  процедуру приема файла

                if (clientMessage.Message.StartsWith("##TransferFile:"))

                {

                    string fname = clientMessage.Message.Remove(0, "##TransferFile:".Length);

                    receiveFile = false;

                    ShowSaveFileDialog(clientInfo, fname);

                    if (!receiveFile)

                        return;

                    int idx = clientPanels.IndexOfKey(clientInfo);

                    InvokeCall(listViewClients, () => listViewClients.Items[idx].Selected = true);

                    InvokeCall(listViewClients, () => listViewClients_DoubleClick(null, null));

                    clientPanels[clientInfo].ReceiveFile(receiveFileName);

                    clientPanels[clientInfo].SendMessage("##FilePort:" + Settings.FilePort);

                    clientPanels[clientInfo].AddLogMessage(">> Входящий файл: " + fname);

                }

// мы отправили  клиенту запрос на передачу  файла

    // если он согласился, то присылает порт, на который мы отправляем файл

                else if (clientMessage.Message.StartsWith("##FilePort:"))

                {

                    string stringPort = clientMessage.Message.Remove(0, "##FilePort:".Length);

                    int port = int.Parse(stringPort);

                    clientPanels[clientInfo].TranferFile(port);

                }

                else

                    clientPanels[clientInfo].AddLogMessage(">> " + clientMessage.Message);

            }

            int index = clientPanels.IndexOfKey(clientInfo);

            clientPanels.Keys[index].IsAlive = true;

            InvokeCall(listViewClients, () => listViewClients.Items[index].Group = listViewClients.Groups["Online"]);

        }

 

//при двойном  клике на клиенте в списке  клиентов.

//Если же существует  панель для отображения истории  клиента - то показываем ее

//иначе создаем и показываем

        private void listViewClients_DoubleClick(object sender, EventArgs e)

        {

            var clientInfo = (ClientInfo) listViewClients.SelectedItems[0].Tag;

 

            int index = clientPanels.IndexOfKey(clientInfo);

Информация о работе Программа по оптимизации передачи данных через сервер