Главная страница

Курсовая работа по ОС. Курсовая работа. исследование механизмов межпроцессного взаимодействия


Скачать 66.8 Kb.
Названиеисследование механизмов межпроцессного взаимодействия
АнкорКурсовая работа по ОС
Дата21.01.2020
Размер66.8 Kb.
Формат файлаdocx
Имя файлаКурсовая работа.docx
ТипКурсовая
#105218
страница2 из 3
1   2   3

КРАТКОЕ ОПИСАНИЕ АЛГОРИТМА


Сервер ожидает входящее соединение на порту 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)
                {
                }
            }
        }


1   2   3


написать администратору сайта