создать клиент-серверное приложение «Библиотека». Операционные системы Лабораторная. Лабораторная работа 2 по дисциплине Операционные системы Лабораторная работа 2 Ф. И. О
Скачать 450.99 Kb.
|
Лабораторная работа №2 по дисциплине: «Операционные системы»
Цель работы: создать клиент-серверное приложение «Библиотека». Алгоритм программы: Запускается приложение, имеющее клиентскую и серверную части, которые являются отдельными программами. Клиентская часть при запуске порождает серверную как новый процесс. Клиентская часть берет на себя работу с интерфейсом пользователя, серверная – работу с файлами и обработку информации. Сервер осуществляет хранение информации. Информация о записях сохраняться в файл *.csv. Между собой клиентская и серверная части взаимодействуют через именованный канал. Окно клиента отображает 4 поля для записи: имя автора, название книги, год издания и издательство. Так же в окне 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.Diagnostics; using StopWordsModel; using System.IO; using System.IO.Pipes; namespace ClientServerApp { public partial class Form1 : Form { private NamedPipeClientStream _pipeClientStream; private StreamWriter _streamWriter; private string _bookAuthor; private string _bookName; private string _bookYear; private string _bookPublisher; private Process _process; public Form1() { InitializeComponent(); // Запуск сервера StartServer(); } private void StartServer() { _process = Process.Start("Server"); //Создание именованного канала _pipeClientStream = new NamedPipeClientStream(NameOptions.PipeName); // и подключение к нему _pipeClientStream.Connect(); _streamWriter = new StreamWriter(_pipeClientStream) { AutoFlush = true }; } // Отправка данных на сервер private void ButtonSend_Click(object sender, EventArgs e) { if (_process.HasExited) { if (MessageBox.Show(text: "Сервер остановлен. Запустить?", caption: "О как. А сервер остановлен", MessageBoxButtons.OKCancel) == DialogResult.OK) { StartServer(); } else { return; } } _streamWriter.WriteLine(MessagesServer.StartServerMessage); _streamWriter.WriteLine(_bookAuthor); _streamWriter.WriteLine(_bookName); _streamWriter.WriteLine(_bookYear); _streamWriter.WriteLine(_bookPublisher); _streamWriter.WriteLine(MessagesServer.FinishServerMessage); MessageBox.Show("Книга записана"); } private void TextBoxName_TextChanged(object sender, EventArgs e) { _bookAuthor = ((TextBox)sender).Text; } private void TextBoxBook_TextChanged(object sender, EventArgs e) { _bookName = ((TextBox)sender).Text; } private void TextBoxYear_TextChanged(object sender, EventArgs e) { _bookYear = ((TextBox)sender).Text; } private void TextBoxPublisher_TextChanged(object sender, EventArgs e) { _bookPublisher = ((TextBox)sender).Text; } //Кнопка остановки сервера private void ButtonStopServer_Click(object sender, EventArgs e) { _streamWriter.WriteLine(MessagesServer.ServerStopMessage); MessageBox.Show("Сервер остановлен!"); } } } Сервер: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO.Pipes; using System.IO; using StopWordsModel; namespace Server { class Program { static void Main(string[] args) { Console.WriteLine("Сервер запущен"); //Создание именованного канала using (var serverStream = new NamedPipeServerStream(NameOptions.PipeName, PipeDirection.InOut)) { //Ожидание подключения клиента serverStream.WaitForConnection(); Console.WriteLine("Соединение установлено"); using (StreamReader sr = new StreamReader(serverStream)) { //считваем строки string tmp; // Если сервер не запущен или остановлен, то выводим сообщение while((tmp = sr.ReadLine()) != MessagesServer.ServerStopMessage) { if(tmp == MessagesServer.StartServerMessage) { string bookAuthor = sr.ReadLine(); string bookName = sr.ReadLine(); string bookYear = sr.ReadLine(); string bookPublisher = sr.ReadLine(); string finishServer = sr.ReadLine(); //Если все строки считаны if (finishServer == MessagesServer.FinishServerMessage) { // Создаем файл для записи данных using (var fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "library.csv", FileMode.Append, FileAccess.Write)) { using (StreamWriter sw = new StreamWriter(fs)) { //Запись информации в файл sw.WriteLine($"Имя автора: {bookAuthor}; Название книги: {bookName};" + $" Год издания: {bookYear}; Издательство: {bookPublisher};"); Console.WriteLine($"Книга '{bookName}' записана"); } } } } } } } Console.WriteLine("Сервер остановлен"); } } } Сообщения серверу (стоп слова): using System; namespace StopWordsModel { public class MessagesServer { // Остановка сервера public static string ServerStopMessage { get; } = "stop"; //Запуск сервера public static string StartServerMessage { get; } = "start"; //отправка информации на сервер public static string FinishServerMessage { get; } = "finish"; } } Имя каналов: using System; using System.Collections.Generic; using System.Text; namespace StopWordsModel { public static class NameOptions { public static string PipeName { get; } = "MyPipe"; } } Внешний вид графического интерфейса клиента Внешний вид интерфейса сервера |