
- •Федеральное агентство связи
- •Московский технический университет связи и информатики
- •1 Задание
- •2 Содержание Оглавление
- •3 Введение
- •4 Основная часть
- •4.1 Задачи курсовой работы
- •4.2 Краткие теоретические основы разрабатываемой темы
- •4.2.1 Межпроцессное взаимодействие. Сокеты
- •4.2.2 Средства синхронизации процессов
- •4.3 Разработка и описание алгоритма работы приложения
- •4.5 Руководство пользователя
- •4.6 Демонстрация программы
- •5 Заключение
- •6 Список использованных источников
- •7 Приложение
- •7.1 Исходный код первого сервера
- •7.2 Исходный код второго сервера
- •7.3 Исходный код клиента
7.2 Исходный код второго сервера
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using Newtonsoft.Json;
using System.Diagnostics;
namespace Server
{
//Классы для отправки данных на клиент
[Serializable]
class OneProcInfo
{
public string Name;
public int priority;
public int[] threads;
public int[] threads_delta;
public OneProcInfo(int ID)
{
this.Name = "";
this.priority = 0;
Process process = Process.GetProcessById(ID);
ProcessThreadCollection arr = process.Threads;
this.threads = new int[arr.Count];
this.threads_delta = new int[arr.Count];
}
public void Fill(Process process)
{
this.Name = process.ProcessName;
this.priority = process.BasePriority;
ProcessThreadCollection arr = process.Threads;
for (int i = 0; i < arr.Count; i++)
{
this.threads[i] = arr[i].Id;
this.threads_delta[i] = arr[i].CurrentPriority - arr[i].BasePriority;
}
}
}
[Serializable]
class AllProcInfo
{
public OneProcInfo[] Processes { get; set; }
public int i { get; set; }
public void FillAll()
{
foreach (Process process in Process.GetProcesses())
this.i++;
this.Processes = new OneProcInfo[this.i];
int i = 0;
foreach (Process process in Process.GetProcesses())
{
this.Processes[i] = new OneProcInfo(process.Id);
this.Processes[i].Fill(process);
i++;
}
}
}
class ClientData
{
public Socket _clientSocket;
public Thread _clientThread;
public int id;
public ClientData()
{
Random rand = new Random(DateTime.Now.Millisecond);
id = rand.Next(1, 101);
_clientThread = new Thread(Server.Program.dataRecieve);
_clientThread.Start(_clientSocket);
}
public ClientData(Socket clientSocket)
{
Random rand = new Random(DateTime.Now.Millisecond);
id = rand.Next(1, 101);
Console.WriteLine("Client has connected");
this._clientSocket = clientSocket;
_clientThread = new Thread(Server.Program.dataRecieve);
_clientThread.Start(_clientSocket);
}
}
class Program
{
//Объявление слушающего сокета
static Socket listener;
static List<ClientData> _clients;
static void Main(string[] args)
{
Console.WriteLine("Starting server... ");
//Создание слушающего сокета
listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_clients = new List<ClientData>();
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 8888);
listener.Bind(ipEndPoint);
Thread listenThread = new Thread(ListenThread);
listenThread.Start();
}
//Функция, реализующая получение запроса от клиента и отправку данных клиенту
public static void dataRecieve(object cSocket)
{
//Создание сокета для нового подключения клиента
Socket clientSocket = (Socket)cSocket;
byte[] bufferIn;
byte[] bufferOut = new byte[1048576];
int readyBytes;
while(true)
{
//Считывание данных из сокета
bufferIn = new byte[clientSocket.SendBufferSize];
readyBytes = clientSocket.Receive(bufferIn);
//Обработка запроса и отправка данных клиенту
if (readyBytes > 0)
{
Console.WriteLine("Preparing to send data...");
//Создание объекта класса, содержащего необходимую информацию для клиента
AllProcInfo info = new AllProcInfo();
info.FillAll();
string serialize = JsonConvert.SerializeObject(info);
bufferOut = Encoding.Unicode.GetBytes(serialize);
//Отправка информации в сокет
clientSocket.Send(bufferOut);
Console.WriteLine("Client disconnected\n");
}
}
}
static void ListenThread()
{
while (true)
{
listener.Listen(10);
_clients.Add(new ClientData(listener.Accept()));
}
}
}
}