Описание Windows-программы 'Messenger'
Содержание
Введение
. Внешнее описание
.1 Определение требований
1.2 Спецификация качества
. Проектирование
.1 Проектирование модульной
структуры программы.
.2 Проектирование главной
формы
.3 Проектирование модуля
формы «About»
. Кодирование программы
. Тестирование и отладка
программы
.1 Разработка методики
тестирования и отладка
.2 Результаты тестирования
. Аттестация
Заключение
Список литературы
Приложения
Введение
В данной пояснительной записке рассматривается описание Windows-программы «Messenger».
Условия задачи: Есть две программы: клиент и сервер. Они должны
взаимодействовать между собой. Клиент должен отправлять сообщения серверу, а
сервер, должен принимать эти сообщения и сохранять их на диске.
Для выполнения поставленной задачи необходимо разобраться с сетевым
вводом/выводом.
В данной программе будет реализована отправка сообщения по протоколу TCP/IP.
В качестве основного инструмента разработки применяется Microsoft Visual Studio.NET.
Язык программирования C#.
1. Внешнее
описание
1.1 Определение
требований
ПС представляет собой автономную программу для операционной системы Windows и не требует процесса установки.
Интерфейс клиента реализован в виде графического окна. Сервер реализован, как
консольное приложение.
Клиент имеет поля TextBox
для ввода сообщений и IP
адреса сервера. После нажатия кнопки Button, сообщение передается серверу. Сервер принимает сообщения и сохраняет их
на диске.
Если сервер не доступен или введен неправильно его IP адрес, клиент получает сообщение об
ошибке.
1.2 Спецификация
качества
ПС должно соответствовать основным критериям качества:
· функциональность: программа является demo - версией, пользование возможно только при наличии ОС
Win32. Возможна доработка программы, в использовании Udp - протокола для широковещательных сообщений,
разработке windows приложения сервера, организации
списка пользователей и таймера для его автоматического обновления, а так же
разработке административных функций серверу;
· надежность ПС это его способность безотказно выполнять
определенные функции при заданных условиях в течение заданного периода времени
с достаточно большой вероятностью. При этом под отказом в ПС понимают
проявление в нем ошибки. В процессе тестирования были проверены все возможные
ситуации взаимодействия сервера и клиента. Все возникшие недочеты были
устранены;
· эффективность: программа предъявляет минимальные требования к
аппаратному обеспечению, захват памяти и процессорного времени минимален,
требования к аппаратным ресурсам намного ниже, чем для самой ОС Win32;
· сопровождаемость:
o изучаемость: программа интуитивно понятна своим интерфейсом,
позволяющим правильно оценить назначение программы. Некоторые объекты
сопровождены надписями, например Send -
отправить сообщение, IPadressServera - поле для ввода IP адреса сервера и другие;
o модифицируемость: клиент и сервер являются легко
модифицируемы, вследствие простой структуры программы;
o структурированность: клиент разделен на два модуля:
функциональная часть, предназначенная для отправки сообщений и информационная
часть, содержащая информацию о программе и разработчике. Сервер представляет
собой консольное приложение.
· мобильность: обеспечивается прямым переносом исполняемых
файлов в любую папку ОС Win.
Установка не требуется. Клиент и сервер работают под любым клоном Win32.
2.
Проектирование
.1
Проектирование модульной структуры программы
Программный модуль - это любой фрагмент описания процесса, оформляемый
как самостоятельный программный продукт. Цели модульного программирование две:
борьба со сложностью и повторное использование программного кода. Модули могут
выполнять некоторые специализированные функции, тем самым, скрывая часть связей
внутри себя. В проектируемой программе можно выделить следующие модули:
· модуль формы клиента “frmMsg.cs”,
реализующий интерфейс пользователя;
· модуль формы клиента “frmAbout.cs” ("О программе");
Рисунок 1. Структура программы
Назначение модуля «frmMsg»:
· описание элементов интерфейса, таких как TextBox - для ввода текста, MenuStrip, Button - для управляющих действий и т.п.
· установка соединения с сервером по средством протокола Tcp/IP и отправка ему сообщений
· передача управления другому модулю, в частности, модулю About
· запуск и завершение приложения
Назначение модуля «frmAbout»:
· данные о программе и разработчике
2.2
Проектирование главной формы
Главная форма реализует интерфейс пользователя. Интерфейс пользователя
должен быть интуитивно понятным.
Большее пространство формы занимает TextBox(TxtMsg)
- это текстовое поле для ввода сообщений. Еще один TextBox(txtIPserver) предназначен для ввода IP
адреса сервера. Для наглядности его сопровождает Label - пояснительная надпись - «IPadressServera».
На форме реализовано Меню- MenuStrip. Оно состоит из двух главных и одного вложенного элемента (File - Exit и About).
«Exit» - предназначен для выхода из
программы, «About» - для вызова информации о программе
и разработчике.
Также на форме имеется кнопка Button(cmdSend), предназначенная для отправки
сообщений.
Рисунок 2. Вид главной формы
Рисунок 3. Реализация меню
.3
Проектирование модуля формы «About»
Модуль формы «About» содержит
информацию о программе и разработчике.
Рисунок 4.
Вид формы «About»
3.
Кодирование программы
При кодировании программ, типа клиент - сервер следует обратить внимание
на сетевой ввод/вывод, основанный на потоках , создаваемых с помощью сокетов.
Сокет - это объект, представляющий конечную точку коммуникаций двух
процессов, связанных между собой через сеть. Сокеты могут работать с различными
протоколами, включаю UDP и TCP/IP. Данная программа осуществляет соединение клиента и сервера
по протоколу TCP/IP.
Чтобы создать сетевой сервер для потока данных , следует вначале создать
объект TcpListener, который будет считывать информацию
указонного порта TCP/IP.
//создаем объект для считывания информации с портаtcpListener = new
TcpListener(ipA [0],8001);
//запускаем порт на прослушку.Start();
Теперь будем ждать, пока какой- нибудь клиент не запросит соединение:
Socket socketForClient = tcpListener.AcceptSocket();
Если соединение с клиентом установлено,
if (socketForClient.Connected)
то вызовем функцию объекта networkStrem.BeginRead, класса NetworkStream для приема сообщений:
networkStrem.BeginRead(, //куда помещать результат
, //смещение.Length , //размер буффера, //делегат обратного вызова);
//локальный объект состояния
Текст программы клиента весьма прост. Клиент создает cокет tcpSocket для порта, прослушиваемого сервером,
и объект класса NetworkStream для
это сокета. Затем он выводит сообщение в поток и освобождает буфер:
System.IO.StreamWriter writer = new
System.IO.StreamWriter(streamToServer);.WriteLine(message);.Flush();
Наиболее подробно вся логика по созданию соединения сервера с клиентом
отражена на рисунке 5.
Рисунок
5. Блок схема
4.
Тестирование и отладка программы
4.1
Разработка методики тестирования и отладка
Продемонстрируем наглядно работу данной программы, оценим правильность
выполнения при подключении клиента к серверу, доставки сообщений до сервера и
запись их на диске.
Подключение клиента к серверу.
1. Подключение клиента к серверу произойдет только после ввода IP адреса сервера и нажатия кнопки Send.
2. Если IP адрес не задан
или задан не верно, то в поле txtMsg
появиться сообщение «Server not found…».
3. Также сообщение «Server not found…» появиться при попытке
приконнектиться к незапущенному серверу.
Рисунок 6. Server not found
Доставка сообщений до сервера и запись их на диск.
Доставка сообщений до сервера осуществляется по протоколу TCP/IP, что гарантирует надежность доставки. На диск этих сообщения
записываются в текстовый файл - logs.txt
Рисунок 7. Доставка сообщений до сервера
Рисунок 8. Запись сообщений в текстовый файл
4.2
Результаты тестирования
На всем протяжении создания программы проводились тесты и их результаты
тщательно анализировались. В результате было выявлено некорректное поведение
программы в двух случаях:
· При отправке текста, размер которого превышает размер буфера сервера, а
именно 256 byte, сервер выводит на экран часть
текста, а клиент, отправивший сообщение подвисает.
· Если после отключения клиента, адрес сервера не изменился, то
вновь запущенный клиент будет коннектиться к серверу без ввода его IP адреса в поле txtIPserver.
messenger сетевой
программа
5. Аттестация
По рассмотренным выше методикам программа тестировалась много раз в
течение всего процесса изготовления программного продукта. Некорректное
поведение программы должно быть исправлено и доработано, но несмотря на это
проведенное тестирование показало, что демо-версия программного продукта
отвечает всем заявленным требованиям:
· Клиент отправляет сообщения серверу
· Сервер принимает сообщения клиента
· Сервер сохраняет принятые сообщения на диск
Заключение
В рамках курсовой работы был разработан сетевой «messenger». И хотя, вероятность использования
данной демо-версии по назначению очень мала, программу можно использовать, как
учебный проект, демонстрирующий программирование сетевого ввода/вывода на
примере протокола TCP/IP.
В дальнейшем хотелось бы разработать дополнительные возможности
мессенджера:
· Отправку сообщений с сервера
· Отправку сообщений между пользователями и «всем
пользователям»
· Windows приложение сервера
· Регистрацию пользователей
· Просмотр списка пользователей по именам
· Автоматическое обновление списка пользователей
· Административные функции мессенджера
· Улучшить интерфейс клиента
· Автоответчик и меню «Информация о пользователе»
Разработав перечисленные выше методы и реализовав их в программе, «messenger» может претендовать на широкое
использование в локальных сетях.
Список
литературы
1. Э. Троелсен. С# и платформа .NET. Библиотека
программиста. М. 2004
. Д. Либерти. C#. Создание .Net
приложений. Программирование на c# .
«Символ-Плюс», СП 2003
3. A.Turtschi. C# .NET Web Developers Guide
. E.Butow,T.Ryan C#. Your visual blueprint for
building .Net aplications
Приложение
SERVER
using
System;System.Collections.Generic;System.Text;System.Net;System.Net.Sockets;System.Threading
;System.IO;class NetworkServer
{clientHandler
{byte[] buffer;Socket socket;NetworkStream networkStrem;AsyncCallback
callbackRead;clientHandler(Socket socketForClient)
{
//инициализируем переменную класса= socketForClient;
//инициализируем буфер для хранения сообщений= new byte[256];
//создаем сетевой поток данных= new NetworkStream(socketForClient);
//установить обратный вызов для операции чтения файла= new
AsyncCallback(this.onReadComplete);
}
//начать чтение строки, переданной клиентомvoid StartRead()
{
//читаем по сети.BeginRead(, //куда помещать результат
, //смещение.Length , //размер буффера, //делегат обратного вызова);
//локальный объект состояния
}
//получив обратый вызов, этот метод выводит
//строку на экран и отсылает ее клиентуrecord_results(string data, string
outName)
{fout = new FileStream(outName, FileMode.OpenOrCreate);sr = new
StreamReader(fout);old = sr.ReadToEnd();.Close();.Close();= old + data;= new
FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);st = new
StreamWriter(fout);.Write(data);.Close();.Close();
}void onReadComplete(IAsyncResult ar)
{temp = networkStrem.EndRead(ar);
//если получена строка(temp > 0)
{
//преобразуем строку в имя файлаs =
System.Text.Encoding.ASCII.GetString(buffer, 0, temp);
//выводим на экран.WriteLine("say client: {0}", s);result
="==>"+ s;_results(result, "C:/temp/LOGS.txt");
}
{.WriteLine("Read connection dropped");.Close();.Close();=
null;= null;
}
}
}void Main(string[] args)
{server = new NetworkServer();.Run();
}void Run()
{host = Dns.GetHostName();ipE = Dns.GetHostEntry(host);[] ipA =
ipE.AddressList;(int i = 0; i < ipA.Length; i++)
{.WriteLine(ipA[i].ToString());
}
//запускаем порт на прослушку.Start();
//слушаем порт(; ; )
{
//по запросу клиента устанавливаем соединение
//и возвращаем новый сокет и продолжаем слушатьsocketForClient =
tcpListener.AcceptSocket();
//если соединение с клиентом установлено(socketForClient.Connected)
{.WriteLine("Client connected");handler = new
clientHandler(socketForClient);
//вызываем вспомогательный метод для приема сообщений.StartRead();
}
}
}
}
CLIENT
System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Text;System.Windows.Forms;System.Net;System.Net.Sockets;msg_Server
{partial class frmMsg : Form
{frmMsg()
{();
}void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{about = new frmAbout();.ShowDialog(this);
}void exitToolStripMenuItem_Click(object sender, EventArgs e)
{.Close();
}NetworkStream streamToServer;void button1_Click(object sender, EventArgs
e)
{
{serverName = txtIPserver.Text;tcpSocket = new TcpClient(serverName,
8001);= tcpSocket.GetStream();message;= txtMSG.Text;
//создаем объект StreamWriter и с его помощью
//отправляем строку на сервер.IO.StreamWriter writer = new
System.IO.StreamWriter(streamToServer);.WriteLine(message);.Flush();.Close();
}{ txtMSG.Text = "server not found..."; }
}
}
}