Курсовая работа по ОС. Курсовая работа. исследование механизмов межпроцессного взаимодействия
Скачать 66.8 Kb.
|
КРАТКОЕ ОПИСАНИЕ АЛГОРИТМАСервер ожидает входящее соединение на порту 12000 (или 13000), на первой сети, которая программа найдет. После получения коннекта он отправляет требуемые данные клиенту. Максимальное количество соединений с целью примера установлено в 2. При запросе соединения мы начинаем передавать данные на тот порт, который передает клиент при коннекте, это позволяет нам передавать данные конкретному клиенту, а не всем сразу. Клиент коннектится с сервером на порту 12000 (или 13000), после того как коннект установлен он получает все необходимые данные из сервера и разрывает соединение. С данными, которые мы передаем можно ознакомиться в пункте «Задания на курсовую работу». РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ.Сервер обладает кнопкой очистить. При нажатии этой кнопки список входящих соединений очищается. Соединение, обработка и посыл данных выполняется в «тихом» режиме без контроля пользователем. Клиент обладает следующими кнопками: Получить данные с сервера 1 – если сервер доступен, тогда мы устанавливаем с ним соединение и получаем данные. В случае если данные не получены, значит соединения нет. Получить данные с сервера 2 аналогично кнопке «Получить данные с сервера 1» за исключением того, что все операции происходят с сервером 2. Очистить все – очищает список сообщений в левой части экрана. Выход – Выход из программы. КОД СЕРВЕРАФайл «Form1.cs» - одинаков для сервера 1 и сервера 2 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.Sockets; using System.Threading; using System.Net; using System.Threading; namespace ServerGUI { public partial class Form1 : Form { SocketServer server; public Form1() { InitializeComponent(); string MyIp = ""; foreach (System.Net.IPAddress ip in System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList) { MyIp = ip.ToString(); break; } server = new SocketServer(MyIp, 12000); server.Start(); Thread list = new Thread(List); list.IsBackground = true; list.Start(); } private void btn_ClearInformation_Click(object sender, EventArgs e) { lbx_clientList.Items.Clear(); } private void List () { for (; ;Thread.Sleep(200) ) if (server.ClientList.Count != lbx_clientList.Items.Count) { lbx_clientList.Invoke(new MethodInvoker(delegate { lbx_clientList.Items.Clear();})); for (int i = 0; i < server.ClientList.Count; i++) lbx_clientList.Invoke(new MethodInvoker(delegate { lbx_clientList.Items.Add(server.ClientList[i]); })); } } private void Form1_Closed(object sender, System.EventArgs e) { server.Dispose(); this.Dispose(); Application.Exit(); } } } Файл «SocketServer.cs» 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; namespace ServerGUI { class SocketServer { public Socket server; private IPEndPoint ip; private List<Thread> thread_list; private int max_conn; public List<string> messageSend = new List<string>(); public List<string> ClientList = new List<string>(); public SocketServer(string ip, Int32 port) { this.max_conn = 2; this.thread_list = new List<Thread>(); this.ip = new IPEndPoint(IPAddress.Parse(ip), port); this.server = new Socket(this.ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp); this.server.Bind(this.ip); this.server.Listen(this.max_conn); } public void Start() { for (int i = 0; i < this.max_conn; i++) { Thread th = new Thread(Listening); th.Start(); thread_list.Add(th); } } public void Dispose() { foreach (Thread th in thread_list) { th.Interrupt(); } server.Close(); } private void Listening() { while (true) { try { using (Socket client = this.server.Accept()) { this.ClientList.Add(client.RemoteEndPoint.ToString()); client.Blocking = true; if(client.Connected) { List<string> message = new List<string>(); message.Add("Текущее местное время: " + System.DateTime.Now.ToLongTimeString()); String strResult = String.Empty; strResult += Convert.ToString(Environment.TickCount / 86400000) + " дней, "; strResult += Convert.ToString(Environment.TickCount / 3600000 % 24) + " часов, "; strResult += Convert.ToString(Environment.TickCount / 120000 % 60) + " минут, "; strResult += Convert.ToString(Environment.TickCount / 1000 % 60) + " секунд."; message.Add("Время работы компьютера: " + strResult); message.Add("[end]"); SendAll(client, message); } } } catch (SocketException ex) { } } } public void SendAll(Socket handler, List<string> message) { for (int i = 0; i < message.Count; ) { Send(message[i], handler); message.RemoveAt(i); Thread.Sleep(5); } } public void Send(string message, Socket handler) { byte[] tosend = Encoding.UTF8.GetBytes(message); try { handler.Send(tosend, 0, tosend.Length, SocketFlags.None); } catch { } } } } Отличия в сервере 2 в классе «SocketServer.cs» private string Priority(int number) { switch (number) { case 4: { return ("Приоритет маленький"); } case 8: { return ("Приоритет нормальный"); } case 13: { return ("Приоритет высокий"); } case 24: { return ("Приоритет реального времени"); } case 10: { return ("Приоритет выше нормального"); } case 6: { return ("Приоритет ниже нормального"); } default: { return ("Приоритет неизвестен"); } } } private void Listening() { while (true) { try { using (Socket client = this.server.Accept()) { this.ClientList.Add(client.RemoteEndPoint.ToString()); client.Blocking = true; if(client.Connected) { List<string> message = new List<string>(); Process[] serverProc = Process.GetProcessesByName("ServerGUI"); for (int i = 0; i < serverProc.Length; i++) { ProcessThreadCollection ListServer = serverProc[i].Threads; message.Add("Сервер N" + i + ": " + Priority(serverProc[i].BasePriority)); message.Add("Количество потоков в сервере " + ListServer.Count); for (int j = 0; j < ListServer.Count; j++) message.Add(" Поток №" + j + ": " + Priority(ListServer[j].BasePriority)); } Process[] clientProc = Process.GetProcessesByName("ClientGUI"); for (int i = 0; i < clientProc.Length; i++) { ProcessThreadCollection ListServer = clientProc[i].Threads; message.Add("Клиент N"+i+": " + Priority(clientProc[i].BasePriority)); message.Add("Количество потоков в клиенте " + ListServer.Count); for (int j = 0; j < ListServer.Count; j++) message.Add(" Поток №" + j + ": " + Priority(ListServer[j].BasePriority)); } message.Add("[end]"); SendAll(client, message); } } } catch (SocketException ex) { } } } |