Автор работы: Пользователь скрыл имя, 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
Актуальность моей работы заключается в создании инструмента для разработки приложений, связанных между собой по сети и работающих как единая система.
Предмет исследования
– возможность разгрузки
Был написан класс NetClient, в котором вообще нет привязки к сетевым компонентам, за всю работу с сетью отвечает 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(byt
{
Bytes = bytes;
IPAdr = ip;
}
}
static class NetClient
{
private static string _serverAddr;
private static int _serverPort;
public static event EventHandler<NetClientGetBytes
private static Socket clientSocket;
private static TcpListener listener;
private static bool _isStarted = false;
private static void OnGetBytes(NetClientGetBytesEv
{
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(
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.
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.
IPAddress[] ipAddresses = Dns.GetHostAddresses(_
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(
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.
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
{
} 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
{
} 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.
clientSocket.ReceiveTimeout = 1000;
clientSocket.Receive(buffer);
string remoteIP = ((IPEndPoint) clientSocket.RemoteEndPoint).
OnGetBytes(new NetClientGetBytesEventArgs(
}
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;
}
}
}
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(
}
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<
}
catch
{
return;
}
//if (clientMessage.Message.
if (clientMessage == null)
{
return;
}
// список клиентов с сервера, приходит в том случае если на сервере обновилась информация о клиентах
if (clientMessage.Message.
{
string JsonMessage = clientMessage.Message.Remove(
var clientList = JsonConvert.DeserializeObject<
ProcessClientList(clientList);
return;
}
var clientInfo = new ClientInfo();
clientInfo.IPAdr = e.IPAdr;
clientInfo.Port = clientMessage.Port;
// для нового клиента
созадется своя панель с
if (!clientPanels.ContainsKey(
{
var panel = new ClientPanel(clientPanel, clientInfo);
clientPanels.Add(clientInfo, panel);
}
if (clientPanels.ContainsKey(
{
if (clientPanels[clientInfo] == null)
clientPanels[clientInfo] = new ClientPanel(clientPanel, clientInfo);
// если поступил запрос от другого клиента на передачу файла
// выводим диалог с запросом имени и запускаем процедуру приема файла
if (clientMessage.Message.
{
string fname = clientMessage.Message.Remove(
receiveFile = false;
ShowSaveFileDialog(clientInfo, fname);
if (!receiveFile)
return;
int idx = clientPanels.IndexOfKey(
InvokeCall(listViewClients, () => listViewClients.Items[idx].
InvokeCall(listViewClients, () => listViewClients_DoubleClick(nu
clientPanels[clientInfo].
clientPanels[clientInfo].
clientPanels[clientInfo].
}
// мы отправили клиенту запрос на передачу файла
// если он согласился, то присылает порт, на который мы отправляем файл
else if (clientMessage.Message.
{
string stringPort = clientMessage.Message.Remove(
int port = int.Parse(stringPort);
clientPanels[clientInfo].
}
else
clientPanels[clientInfo].
}
int index = clientPanels.IndexOfKey(
clientPanels.Keys[index].
InvokeCall(listViewClients, () => listViewClients.Items[index].
}
//при двойном клике на клиенте в списке клиентов.
//Если же существует
панель для отображения
//иначе создаем и показываем
private void listViewClients_DoubleClick(ob
{
var clientInfo = (ClientInfo) listViewClients.SelectedItems[
int index = clientPanels.IndexOfKey(
Информация о работе Программа по оптимизации передачи данных через сервер