Описание Windows-программы "Messenger"

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Содержание

  • Введение
  • 1. Внешнее описание
    • 1.1 Определение требований
    • 1.2 Спецификация качества
  • 2. Проектирование
    • 2.1 Проектирование модульной структуры программы.
    • 2.2 Проектирование главной формы
    • 2.3 Проектирование модуля формы «About»
  • 3. Кодирование программы
  • 4. Тестирование и отладка программы
    • 4.1 Разработка методики тестирования и отладка
    • 4.2 Результаты тестирования
  • 5. Аттестация
  • Заключение
  • Список литературы
  • Приложения

Введение

В данной пояснительной записке рассматривается описание 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. Проектирование

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. Реализация меню

2.3 Проектирование модуля формы «About»

Модуль формы «About» содержит информацию о программе и разработчике.

Рисунок 4. Вид формы «About»

3. Кодирование программы

При кодировании программ, типа клиент — сервер следует обратить внимание на сетевой ввод/вывод, основанный на потоках, создаваемых с помощью сокетов.

Сокет — это объект, представляющий конечную точку коммуникаций двух процессов, связанных между собой через сеть. Сокеты могут работать с различными протоколами, включаю UDP и TCP/IP. Данная программа осуществляет соединение клиента и сервера по протоколу TCP/IP.

Чтобы создать сетевой сервер для потока данных, следует вначале создать объект TcpListener, который будет считывать информацию указонного порта TCP/IP.

//создаем объект для считывания информации с порта

TcpListener tcpListener = new TcpListener (ipA [0], 8001);

//запускаем порт на прослушку

tcpListener. Start ();

Теперь будем ждать, пока какой- нибудь клиент не запросит соединение:

Socket socketForClient = tcpListener. AcceptSocket ();

Если соединение с клиентом установлено,

if (socketForClient. Connected)

то вызовем функцию объекта networkStrem. BeginRead, класса NetworkStream для приема сообщений:

networkStrem. BeginRead (

buffer, //куда помещать результат

0, //смещение

buffer. Length, //размер буффера

callbackRead, //делегат обратного вызова

null); //локальный объект состояния

Текст программы клиента весьма прост. Клиент создает cокет tcpSocket для порта, прослушиваемого сервером, и объект класса NetworkStream для это сокета. Затем он выводит сообщение в поток и освобождает буфер:

System. IO. StreamWriter writer = new System. IO. StreamWriter (streamToServer);

writer. WriteLine (message);

writer. 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

2. Д. Либерти. C#. Создание. Net приложений. Программирование на c#. «Символ-Плюс», СП 2003

3. A. Turtschi. C#. NET Web Developers Guide

4. E. Butow, T. Ryan C#. Your visual blueprint for building. Net aplications

Приложение

SERVER

using System;

using System. Collections. Generic;

using System. Text;

using System. Net;

using System. Net. Sockets;

using System. Threading;

using System. IO;

public class NetworkServer

{

class clientHandler

{

private byte[] buffer;

private Socket socket;

private NetworkStream networkStrem;

private AsyncCallback callbackRead;

public clientHandler (Socket socketForClient)

{

//инициализируем переменную класса

socket = socketForClient;

//инициализируем буфер для хранения сообщений

buffer = new byte[256];

//создаем сетевой поток данных

networkStrem = new NetworkStream (socketForClient);

//установить обратный вызов для операции чтения файла

callbackRead = new AsyncCallback (this. onReadComplete);

}

//начать чтение строки, переданной клиентом

public void StartRead ()

{

//читаем по сети

networkStrem. BeginRead (

buffer, //куда помещать результат

0, //смещение

buffer. Length, //размер буффера

callbackRead, //делегат обратного вызова

null); //локальный объект состояния

}

//получив обратый вызов, этот метод выводит

//строку на экран и отсылает ее клиенту

void record_results (string data, string outName)

{

FileStream fout = new FileStream (outName, FileMode. OpenOrCreate);

StreamReader sr = new StreamReader (fout);

string old = sr. ReadToEnd ();

sr. Close ();

fout. Close ();

data = old + data;

fout = new FileStream (outName, FileMode. OpenOrCreate, FileAccess. Write);

StreamWriter st = new StreamWriter (fout);

st. Write (data);

st. Close ();

fout. Close ();

}

private void onReadComplete (IAsyncResult ar)

{

int temp = networkStrem. EndRead (ar);

//если получена строка

if (temp > 0)

{

//преобразуем строку в имя файла

string s = System. Text. Encoding. ASCII. GetString (buffer, 0, temp);

//выводим на экран

Console. WriteLine («say client: {0}», s);

string result ="==> «+ s;

record_results (result, «C: /temp/LOGS. txt»);

}

else

{

Console. WriteLine («Read connection dropped»);

networkStrem. Close ();

socket. Close ();

networkStrem = null;

socket = null;

}

}

}

static void Main (string[] args)

{

NetworkServer server = new NetworkServer ();

server. Run ();

}

private void Run ()

{

string host = Dns. GetHostName ();

IPHostEntry ipE = Dns. GetHostEntry (host);

IPAddress[] ipA = ipE. AddressList;

for (int i = 0; i < ipA. Length; i++)

{

Console. WriteLine (ipA[i]. ToString ());

}

//создаем объект для считывания информации с порта

TcpListener tcpListener = new TcpListener (ipA [0], 8001);

//запускаем порт на прослушку

tcpListener. Start ();

//слушаем порт

for (;;)

{

//по запросу клиента устанавливаем соединение

//и возвращаем новый сокет и продолжаем слушать

Socket socketForClient = tcpListener. AcceptSocket ();

//если соединение с клиентом установлено

if (socketForClient. Connected)

{

Console. WriteLine («Client connected»);

clientHandler handler = new clientHandler (socketForClient);

//вызываем вспомогательный метод для приема сообщений

handler. StartRead ();

}

}

}

}

CLIENT

using System;

using System. Collections. Generic;

using System. ComponentModel;

using System. Data;

using System. Drawing;

using System. Text;

using System. Windows. Forms;

using System. Net;

using System. Net. Sockets;

namespace msg_Server

{

public partial class frmMsg: Form

{

public frmMsg ()

{

InitializeComponent ();

}

private void aboutToolStripMenuItem_Click (object sender, EventArgs e)

{

frmAbout about = new frmAbout ();

about. ShowDialog (this);

}

private void exitToolStripMenuItem_Click (object sender, EventArgs e)

{

this. Close ();

}

private NetworkStream streamToServer;

private void button1_Click (object sender, EventArgs e)

{

try

{

string serverName = txtIPserver. Text;

TcpClient tcpSocket = new TcpClient (serverName, 8001);

streamToServer = tcpSocket. GetStream ();

string message;

message = txtMSG. Text;

//создаем объект StreamWriter и с его помощью

//отправляем строку на сервер

System. IO. StreamWriter writer = new System. IO. StreamWriter (streamToServer);

writer. WriteLine (message);

writer. Flush ();

streamToServer. Close ();

}

catch { txtMSG. Text = «server not found… «; }

}

}

}

ПоказатьСвернуть
Заполнить форму текущей работой