Создание программы обмена текстовыми сообщениями через локальную сеть

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,23 Mb
  • Опубликовано:
    2011-12-18
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Создание программы обмена текстовыми сообщениями через локальную сеть

Содержание

Введение

. Анализ исходных данных

. Проектирование программного комплекса

. Разработка и тестирование программного комплекса

Заключение

Список использованной литературы

Приложения

Введение

Цель курсового проекта: создание программы обмена текстовыми сообщениями через локальную сеть.

Программа должна осуществлять передачу текстовых сообщений по сети. Архитектура программы должна включать в себя клиентскую и серверную часть. Чтобы начать обмен текстовыми сообщениями, на одном из компьютеров локальной сети должна быть запущена копия программы в серверном режиме. Для того, что бы программа знала, кому и куда передавать нужные сообщения необходимо использовать IP адрес и порт.

Перед передачей текстовых сообщений необходимо настроить обязательные параметры: вначале программы пользователю предлагают создать свой сервер либо быть клиентом (подключиться к уже созданному серверу в сети), далее необходимо ввести индивидуальное имя пользователя, IP-адрес и номер порта подключения. После выполнения настроек всех параметров программы в поле “окна текстовых сообщений” вводим нужную нам текстовую информацию и отправляем всем пользователем чата (отправка осуществляется по типу клиент0=>сервер=>клиент1 =>клиент2=>клиент n). Окно “чата сообщений” будет отображать всю переписку текстовыми сообщениями всех клиентов, находящихся на данном сервере. Весь архив сообщений можно узнать путём нажатия на кнопку “открыть логи”, где содержится история всей переписки пользователя. В данном архиве должна содержаться информация о имени получателя (отправителя) сообщений, непосредственно само сообщение и время и дата отправление (получения) сообщения.

1. 
Анализ исходных данных

При выполении данного курсового проекта будем использовать среду разработки Microsoft Visual Studio 2008 VС++.

Выбор данной среды разработки объясняется рядом преимуществ:

)        Более быстрое написание кода. Основа любого программного решения - это код, написанный разработчиками. Visual Studio 2008 помогает писать код быстрее, поддерживая множество средств и возможностей, которые повышают производительность труда: технологию IntelliSense®, автозавершение операторов, автоматическое выделение цветом синтаксических конструкций, поиск методов, проверку синтаксиса и типов, оптимизацию (рефакторинг) кода, управление фрагментами кода и многое другое.

)        Встроенные средства. Visual Studio 2008 повышает производительность труда разработчиков, предоставляя набор встроенных средств, автоматизирующих не только кодирование, но и другие операции. Система управления проектами Visual Studio позволяет без усилий решать все задачи по управлению проектами - от написания первой строки кода до создания пакета для развертывания готового ПО. В процессе разработки доступны визуальные конструкторы, обозреватели серверов и данных, отладчики, средства автоматической сборки, фоновая компиляция, интеграция с системой контроля версий исходного кода, встроенная справочная система, а также ряд расширений Visual Studio от сторонних производителей. Благодаря всему этому разработчики могут сосредоточиться на выполнении бизнес-задач и быстрее их решать.

)        Разработка программного обеспечения для Windows. Visual Studio 2008 позволяет создавать программы, используя основные Windows API, Microsoft Foundation Classes, NET Framework или любой SDK. С помощью одного набора инструментов можно разрабатывать системные службы, драйверы устройств, утилиты, игры, настольное ПО, приложения для автоматизации направлений бизнеса и многое другое. Независимо от типа ПО, Visual Studio помогает создавать более удобные пользовательские интерфейсы, связывать приложения и бизнес-процессы и ускорять реализацию решений.

)        Microsoft Visual Studio 2008 помогает индивидуальным разработчикам и небольшим группам, создающим решения для Интернета, Windows, Microsoft Office и Windows Mobile, ускорить создание решений, значительно облегчить жизнь пользователям, повысить эффективность коллективной работы. Независимо от платформы, на которую ориентировано решение, Visual Studio 2008 обеспечивает эффективность, производительность и стабильность, необходимые для того, чтобы разработчики могли сосредоточиться на действительно важных бизнес-задачах. Также в Visual Studio 2008 поддерживается обширная экосистема, благодаря которой разработчики всегда могут найти партнеров, информацию и других членов сообщества, способных помочь в написании великолепного программного обеспечения.

)        Visual Studio 2008 Standard Edition поддерживает разработку ПО для Интернета и для операционной системы Windows, в том числе для Windows Vista® и Windows Server® 2008. Visual Studio 2008 Professional Edition поддерживает разработку ПО для Интернета, Windows, Microsoft Office и Windows Mobile.

. Проектирование программного комплекса

программа обмен сообщение локальный

При создании программного комплекса, необходимо установить ключевые элементы управления программой. Данными элементами являются: кнопки - создания сервера (если сервер не создан), подключения клиента к серверу, выход либо остановка чата, отправка введённого сообщения, отображения архива сообщений; так же области ввода имени (nick name) пользователя, ввод IP-адреса подключения, номера порта, окно ввода сообщений, окно отображения полученных сообщений.

На стороне сервера весь программный комплекс представляет собой:

)        При создании сервера необходимо ввести имя пользователя (вызываем функцию QueryName - запрос имени чатующего перед созданием сокета);

)        Запуск сервера (OnBnClickedRadioServer - функция создания сервера);

)        Используем запреты доступа (DisabledControl - запреты на ввод IP-адреса, порта и имени чатующего после создания сервера);

)        Принимаем запросы на подключения (вызываем функцию OnAccept, при которой создаём сокет и добавляем его в список рабочих сокетов);

)        Извлечение сообщения из сети (OnReceive - содержит информацию о имени чатующего, содержимое сообщения, времени и даты отправителя сообщения, тут же отсылка принятого севером сообщения в сеть другим клиентам, как зеркало, клиент может работать с другими клиентами в сети только через сервер);

)        После формирования буфера текстового сообщения (функция SendChat), посылаем подготовленное сообщение в сеть (SendBuffer);

)        Отправляем клиентам количество людей в чате (SendCountPeople);

)        После окончания работы сервера останавливаем чат (StopChat).

На стороне клиента программный комплекс представлен следующими действиями:

)        При активации клиента необходимо ввести имя пользователя (вызываем функцию QueryName - запрос имени чатующего перед созданием сокета);

)        Запуск клиента (OnBnClickedRadioClient - функция создания сервера);

)        Используем запреты доступа (DisabledControl - запреты на ввод IP-адреса, порта и имени чатующего после создания сервера);

)        Активируем событие подключения (OnConnect);

)        Отправляем подготовленное сообщение (OnBnClickedButtonSen):

)        После окончания работы клиента выходим из чата (StopChat).

Программный комплекс сокета представлен следующими действами:

)        Инициализация сокета;

)        Подключение на стороне клиента (OnConnect);

)        Инициализация возможности получения сообщений (OnReceive);

)        Осуществление запроса на подключения, направляемого клиентом серверу(OnAccept).

Схема отправки сообщений представлена на рисунке 1.

Рисунок 1. Схема отправки сообщений

Разработанная программа содержит файлы:

ChatCppDlg.cpp - основной файл реализации функций, включающий класс диалогового окна.

Это главный файл проекта для VC C++. Проекты генерируется с использованием мастера приложений. Он содержит информацию о версии Visual C++, информацию о платформах, конфигурацию и особенность проекта..h - Основной включаемый файл приложения. В нем описан главный класс приложения, а также подключены другие включаемые файлы;.cpp - Основной файл приложения. В нем определены методы главного класса CChatCppApp приложения и глобальные объекты;.cpp - класс сокетов;.rc - Файл ресурсов. В этом файле описаны все ресурсы приложения.

Сами ресурсы могут быть записаны в каталоге RES, расположенном в главном каталоге проекта;\ChatCpp.ico - Файл иконки, который используется для прикладного окна;\ChatCpp.rc2 - В этом файле определены ресурсы, которые нельзя редактировать с помощью редактора ресурсов среды Visual C++..h - ключает информацию о структуре (имени чатующего, буфер сообщений, времени и дату получателя сообщения), устанавливает связь между диалоговым окном и программой;

Другие стандартные файлы:.h - Включаются заголовочные файлы, которые редко меняются.Или вообще никогда не меняются для данного проекта (те же stdio.h или windows.h). Чтобы откомпилировать один раз и забыть.

Сопутствующий файл - stdafx.cpp - обычно содержит только #include "stdafx.h". Он, собственно, и компилируется..h - Стандартный файл заголовка. Visual C++ читает и корректирует этот файл..manifest - Файл описывает тип платформы, версию, тип проекта и т.д..txt - Описание всех заголовочных файлов, файлов исходного кода, а так-же файлов ресурсов.

Листинг основного файла реализации:

// файл реализации

#include <stdio.h>

#include <stdlib.h>

#include "stdafx.h"

#include "ChatCppDlg.h"

#include ".\chatcppdlg.h"

// CAboutDlg => класс диалогового окнаCAboutDlg : public CDialog

{:();

// связь с ABOUTBOX через индентификатор IDD{ IDD = IDD_ABOUTBOX };:void DoDataExchange(CDataExchange* pDX); //функция обмена данными

// реализация:_MESSAGE_MAP() // таблица откликов:_msg void OnBnClickedOk();

};::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}CAboutDlg::DoDataExchange(CDataExchange* pDX)

{::DoDataExchange(pDX);

}_MESSAGE_MAP(CAboutDlg, CDialog)_BN_CLICKED(IDOK, &CAboutDlg::OnBnClickedOk)_MESSAGE_MAP()

// CChatCppDlg реализация::CChatCppDlg(CWnd* pParent /*=NULL*/)

{_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}CChatCppDlg::DoDataExchange(CDataExchange* pDX)

{::DoDataExchange(pDX);_Control(pDX, IDC_RADIO_SERVER, m_ButtonStartServer); // Связывет объект сервера с контролом Server_Control(pDX, IDC_RADIO_CLIENT, m_ButtonStartClient);_Control(pDX, IDC_EDIT_NAME, m_wndName);_Control(pDX, IDC_EDIT_IP, m_wndIPAddress);_Control(pDX, IDC_EDIT_PORT, m_wndPort);_Control(pDX, IDC_EDIT_SEND, m_wndSend);_Control(pDX, IDC_BUTTON_SEND, m_ButtonSend);_Control(pDX, IDC_BUTTON_STOPCHAT, m_ButtonStopChat);_Control(pDX, IDC_EDIT_CHAT, m_wndChat);_Control(pDX, IDC_STATIC_COUNTPEOPLE, m_wndCountPeople);

}_MESSAGE_MAP(CChatCppDlg, CDialog)_WM_SYSCOMMAND() // будем обрабатывать системные события_WM_PAINT() //микрокоманды обновления клиентской области_WM_QUERYDRAGICON()_BN_CLICKED(IDC_RADIO_SERVER, OnBnClickedRadioServer) // макрокоманды вызова обработчика сообщений от кнопок_BN_CLICKED(IDC_RADIO_CLIENT, OnBnClickedRadioClient)_BN_CLICKED(IDC_BUTTON_STOPCHAT, OnBnClickedButtonStopchat)_BN_CLICKED(IDC_BUTTON_SEND, OnBnClickedButtonSend)_WM_CLOSE()_EN_CHANGE(IDC_EDIT_NAME, &CChatCppDlg::OnEnChangeEditName)_EN_CHANGE(IDC_EDIT_IP, &CChatCppDlg::OnEnChangeEditIp)_EN_CHANGE(IDC_EDIT_PORT, &CChatCppDlg::OnEnChangeEditPort)_EN_CHANGE(IDC_EDIT_SEND, &CChatCppDlg::OnEnChangeEditSend)_BN_CLICKED(IDC_STATIC_COUNTPEOPLE, &CChatCppDlg::OnBnClickedStaticCountpeople)_BN_CLICKED(IDC_BUTTON1, &CChatCppDlg::OnBnClickedButton1)_LBN_SELCHANGE(IDC_LIST1, &CChatCppDlg::OnLbnSelchangeList1)_MESSAGE_MAP()CChatCppDlg::OnInitDialog()

{::OnInitDialog();

// Необходимая инициализация("Нет сети!");_wndName.SetLimitText(12); // Ограничение количества вводимых символов._wndName.SetWindowText(g_EmptyName);_wndSend.SetLimitText(200); // Ограничение количества вводимых символов._wndIPAddress.SetWindowText("127.0.0.1"); // Адрес по умолчанию для тестирования._wndPort.SetWindowText("1500"); // Порт по умолчанию._ButtonStopChat.SetWindowText(g_strExitFromChat);_mainSocket.m_pParent = this;TRUE;

}CChatCppDlg::OnSysCommand(UINT nID, LPARAM lParam)

{((nID & 0xFFF0) == IDM_ABOUTBOX)

{dlgAbout;.DoModal();

}

{::OnSysCommand(nID, lParam);

}

}CChatCppDlg::OnPaint()

{(IsIconic())

{dc(this); //контекст устройства для рисования(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// выравнивание значка по центру клиентского прямоугольникаcxIcon = GetSystemMetrics(SM_CXICON);cyIcon = GetSystemMetrics(SM_CYICON);rect;(&rect);x = (rect.Width() - cxIcon + 1) / 2;y = (rect.Height() - cyIcon + 1) / 2;.DrawIcon(x, y, m_hIcon);

}

{::OnPaint();

}

}

// вызов данной функции системой при перетаскивании окнаCChatCppDlg::OnQueryDragIcon()

{static_cast<HCURSOR>(m_hIcon);

}

// Запускаем серверCChatCppDlg::OnBnClickedRadioServer()

{

// Проверки несанкционированного запуска сервера:

// Если кнопка не в состоянии нажатой,

// если сокет в работе (т.е. только с нулевым сокетом можно начинать работать),

// очень неудобно если в чате все будут под одинаковыми именами.(m_ButtonStartServer.GetCheck() != BST_CHECKED) return;(m_mainSocket.m_hSocket != INVALID_SOCKET) return;(QueryName() == false)

{("Введите свое имя для чата!");();;

}strPort;_wndPort.GetWindowText(strPort);

// Класс CAsyncSocket упрощает процедуру создания сокета,

// вкладывая в функцию Create() непосредственное создание

// сокета и связывание его с одним из IP адресом доступном на компьютере.

// atoi конвертирует строку ansi to int(m_mainSocket.Create(atoi(strPort)) == FALSE)

{("Ошибка создания сервера!\nВозможно данный порт уже используется!");();

}

{

// Вводим сокет в режим прослушивания запросов на подключения.(m_mainSocket.Listen() == FALSE)

{();

}

{

// Если все в порядке.(true);("Сервер ждет подключения!");

// В чате только сервер._wndCountPeople.SetWindowText("В чате 1 чел. online");

}

}

}

// Запускаем клиентаCChatCppDlg::OnBnClickedRadioClient()

{

// Контроль несанкционированного запуска клиента:

// Если кнопка не в состоянии нажатой,

// если сокет в работе (т.е. только с нулевым сокетом можно начинать работать),

// очень неудобно если в чате все будут под одинаковыми именами..(m_ButtonStartClient.GetCheck() != BST_CHECKED) return;(m_mainSocket.m_hSocket != INVALID_SOCKET) return;(QueryName() == false)

{("Введите свое имя для чата!");();;

}

// Класс CAsyncSocket упрощает процедуру создания сокета,

// вкладывая в функцию Create() непосредственное создание

// сокета и связывание его с одним из IP адресом доступном на компьютере.(m_mainSocket.Create() == TRUE)

{strAddress;_wndIPAddress.GetWindowText(strAddress);strPort;_wndPort.GetWindowText(strPort);(m_mainSocket.Connect(strAddress, atoi(strPort)) == FALSE)

{

// В ассинхронном режиме код этой ошибки

// считается как ожидание события подключения,

// т.е. практически успешный возврат.(GetLastError() == WSAEWOULDBLOCK)

{(false);

}

{

// иначе при возникновения какой либо ошибки останавливаем чат();

}

}

}

// Нажали кнопку "Выйти из чата".CChatCppDlg::OnBnClickedButtonStopchat()

{();

}

// Запрещает доступ к управлениям при работе

// приложения в режиме сервера или клиента.

// Цель запрета - избежать исключения от

// случайного нажатия "неправильных" кнопок.CChatCppDlg::DisabledControl(bool server)

{

// Запреты._wndIPAddress.EnableWindow(FALSE);_wndPort.EnableWindow(FALSE);_ButtonSend.EnableWindow(FALSE);(server == true)

{_ButtonStopChat.SetWindowText(g_strStopChat);_ButtonStartClient.EnableWindow(FALSE);

}

{_ButtonStopChat.SetWindowText(g_strExitFromChat);_ButtonStartServer.EnableWindow(FALSE);

}

// Разрешения.

// Разрешить возможность выхода из чата._ButtonStopChat.EnableWindow(TRUE);

}

// Разрешить доступ к управлениям после закрытия сокетов.

// Цель запрета - избежать исключения от

// случайного нажатия "неправильных" кнопок.CChatCppDlg::EnabledControl(void)

{

// Разрешения._wndIPAddress.EnableWindow(TRUE);_wndPort.EnableWindow(TRUE);_ButtonStartClient.EnableWindow(TRUE);_ButtonStartServer.EnableWindow(TRUE);

// Запреты._ButtonStopChat.EnableWindow(FALSE);_ButtonSend.EnableWindow(FALSE);

}

// Принимаем запросы на подключенияCChatCppDlg::OnAccept(void)

{* pSock = new CSock;>m_pParent = this;

// Если все в порядке добавим рабочий сокет в список

// подключенных рабочих сокетов.(m_mainSocket.Accept(*pSock) == TRUE)

{_vecSockets.push_back(pSock);_ButtonSend.EnableWindow(TRUE);();

}pSock;("Сеть работает!");

}

// Выход из чата,

// если это сработало на стороне сервера,

// то это полная остановка чата.CChatCppDlg::StopChat(void)

{

// Отсылаем сигнал об отключении от чата.();_mainSocket.Close();(int i = 0; i < (int)m_vecSockets.size(); i++)

{_vecSockets[i]->Close();m_vecSockets[i];

}

// Очистим вектор от ненужных элементов._vecSockets.clear();_ButtonStartServer.SetCheck(BST_UNCHECKED);_ButtonStartClient.SetCheck(BST_UNCHECKED);

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

// повторных попыток.();

// В чате нет никого._wndCountPeople.SetWindowText("В чате 0 чел.");("Нет сети!");

}

// Отправка подготовленного сообщения.CChatCppDlg::OnBnClickedButtonSend()

{strChat;_wndSend.GetWindowText(strChat);(strChat);

}

// Извлечение сообщений из сети чата.CChatCppDlg::OnReceive(void)

{sb;(m_ButtonStartServer.GetCheck() == BST_CHECKED)

{

// Сервер несет большую нагрузку при получении сообщений.(int index = 0; index < (int)m_vecSockets.size(); index++)

{_vecSockets[index]->Receive(&sb, sizeof(SENDBUFFER));

// Если кто-то отключился, удаляем этого клиента

// из списка доступных клиентов.(sb.typemessage == m_TypeMessage::tmDisconnect)

{_vecSockets[index]->Close();m_vecSockets[index];_vecSockets.erase(m_vecSockets.begin() + index);();

// Отсылка принятого севером сообщения в сеть другим клиентам,

// как зеркало, клиент может работать с другими клиентами в

// сети только через сервер.(sb, false);;

}

// Рассылаем сообщения клиента по сети чата.(sb.typemessage == m_TypeMessage::tmChat)

{(sb, false);;

}

}

}if(m_ButtonStartClient.GetCheck() == BST_CHECKED)

{_mainSocket.Receive(&sb, sizeof(SENDBUFFER));

}

// Обработка принятого сообщения на основе

// его типа.(sb.typemessage)

{m_TypeMessage::tmCountPeople:

{_wndCountPeople.SetWindowText("В чате " +(sb.countpeople) + " чел. online");

};m_TypeMessage::tmChat:

{strChat;_wndChat.GetWindowText(strChat);+= " " + CString(sb.name) + ": " + CString(sb.buffer) + " ("+ IntToStr(sb.d)+ ":"+ IntToStr(sb.e)+":"+ IntToStr(sb.f)+ "-"+IntToStr(sb.a)+":"+ IntToStr(sb.b)+":" + IntToStr(sb.c)+")"+ "\r\n";_wndChat.SetWindowText(strChat);number_line = m_wndChat.GetLineCount();_wndChat.LineScroll(number_line);

{strChat;_wndChat.GetWindowText(strChat);

// Если принято сообщение об остановки чата(отключении сервера),

// изменим содержимое сообщения.(sb.stopchat == true)

{();+= " " + CString(sb.name) + ": Чат остановлен!" + "\r\n"+ "==============================" + "\r\n";

}

{+= " " + CString(sb.name) + " - покинул(а) чат!" + "\r\n";

}* fo;= fopen("client.txt","ab");(fo,strChat);_wndChat.SetWindowText(strChat);number_line = m_wndChat.GetLineCount();_wndChat.LineScroll(number_line);

};:("Неизвестное сообщение!");;

}

}

// При закрытии приложения отправим в чат

// информацию об отключении чатующего.CChatCppDlg::OnClose()

{();::OnClose();

}

// Послать строку-сообщение в чат.CChatCppDlg::SendChat(CString strMessage)

{sb;len = strMessage.GetLength();(sb.buffer, strMessage.GetBuffer(), sizeof(TCHAR)*len);_wndName.GetWindowText(strMessage);= strMessage.GetLength();(sb.name, strMessage.GetBuffer(), sizeof(TCHAR)*len);.typemessage = m_TypeMessage::tmChat;(sb, true);

}

// Послать буфер подготовленного сообщения в сеть.CChatCppDlg::SendBuffer(SENDBUFFER sb, bool toserver)

{

// Если сокет не создан, нечего делать в этой функции.(m_mainSocket.m_hSocket == INVALID_SOCKET) return;(m_ButtonStartServer.GetCheck() == BST_CHECKED)

{(int i = 0; i < (int)m_vecSockets.size(); i++)

{send = m_vecSockets[i]->Send(&sb, sizeof(SENDBUFFER));(send == sizeof(SENDBUFFER))

{_wndSend.SetWindowText("");

}

}

// Если непосредственно отправку осуществляет сервер,

// отобразим его сообщение в его же окне отправки,

// флаг toserver необходим поскольку данная функция

// может работать в режиме зеркала см. CChatCppDlg::OnReceive(void).(toserver == true)

{(sb.typemessage == m_TypeMessage::tmChat)

{strChat;_wndChat.GetWindowText(strChat);+= " " + CString(sb.name) + ": " + CString(sb.buffer) + " ("+ IntToStr(sb.d)+ ":"+ IntToStr(sb.e)+":"+ IntToStr(sb.f)+ "-"+IntToStr(sb.a)+":"+ IntToStr(sb.b)+":" + IntToStr(sb.c)+")"+ "\r\n";_wndChat.SetWindowText(strChat);number_line = m_wndChat.GetLineCount();_wndChat.LineScroll(number_line);

}(sb.typemessage == m_TypeMessage::tmDisconnect)

{strChat;_wndChat.GetWindowText(strChat);+= " " + CString(sb.name) + ": " + "Чат остановлен!" + "\r\n" + "===============================\r\n";* fo;= fopen("server.txt","ab");(fo,strChat);_wndChat.SetWindowText(strChat);number_line = m_wndChat.GetLineCount();_wndChat.LineScroll(number_line);

}

}

}if(m_ButtonStartClient.GetCheck() == BST_CHECKED)

{send = m_mainSocket.Send(&sb, sizeof(SENDBUFFER));(send == sizeof(SENDBUFFER))_wndSend.SetWindowText("");

}

}

// Формируем и отправляем сообщение об отключении от сети.CChatCppDlg::SendDisconnect(void)

{strChat;_wndChat.GetWindowText(strChat);sb;s;_wndName.GetWindowText(s);len = s.GetLength();(sb.name, s.GetBuffer(), sizeof(TCHAR)*len);.typemessage = m_TypeMessage::tmDisconnect;

// Отсоединение сервера останавливает чат.(m_ButtonStartServer.GetCheck() == BST_CHECKED).stopchat = true;(sb, true);

}

// Событие подключения, происходит на стороне клиента.CChatCppDlg::OnConnect(BOOL Error)

{(Error == TRUE)

{("Попытка подключения была отвергнута!\nВозможно сервер еще не создан!");();

}

{_ButtonSend.EnableWindow(TRUE);("Сеть работает!");

}

}

// Сервер отправляет клиентам количество людей в чате.CChatCppDlg::SendCountPeople(void)

{countpeople = 1/*сервер*/ + (int)m_vecSockets.size()/*клиенты*/;_wndCountPeople.SetWindowText("В чате " +(countpeople) + " чел. online");

// Отправим сообщение о количествах людей в чате.sb;.typemessage = m_TypeMessage::tmCountPeople;.countpeople = countpeople;(int i = 0; i < (int)m_vecSockets.size(); i++)

{send = m_vecSockets[i]->Send(&sb, sizeof(SENDBUFFER));

}

}

// Запрос имени чатующего перед созданием сокета.CChatCppDlg::QueryName(void)

{strName;_wndName.GetWindowText(strName);(strName == g_EmptyName || strName.IsEmpty() == true)false;true;

}CChatCppDlg::OnEnChangeEditName()

{

}CChatCppDlg::OnEnChangeEditIp(){}CChatCppDlg::OnEnChangeEditPort(){}CChatCppDlg::OnEnChangeEditSend() {}CChatCppDlg::OnBnClickedStaticCountpeople()

{}CAboutDlg::OnBnClickedOk()

{();

}CChatCppDlg::OnEnChangeEditChat() {}CChatCppDlg::OnBnClickedButton1()

{("C:\\\\Users\\Администратор\\Desktop\\client_start\\ChatCpp\\client.txt");

}

. Разработка и тестирование программного комплекса

Результатом работы программы стал обмен текстовой информацией между удаленными компьютерами локальной сети. Окно первого запуска изображено на рисунке 2.

Рисунок 2. Окно первого запуска


Рисунок 3. Окно сервера

Окно клиента изображено на рисунке 4.

Рисунок 4. Окно клиента

Проверка отправки и прихода сообщений изображено на рисунке 6.

Рисунок 5. Проверка отправки и прихода сообщений

К преимуществам данной программы можно отнести:

)        Интуитивно понятный интерфейс;

)        Скорость пересылки сообщений на высоком уровне;

)        Возможность открытия архива всех сообщений;

)        Вся необходимая информация читабельна и находится перед пользователем;

)        Отображение (в верхнем левом углу) состояния чата.

Недостатки:

)        Отсутствие возможности отправки личного сообщения;

)        В случае неработоспособности сервера, клиент не сможет подключиться к сети (для решения данной проблемы обычно используют дублирующие сервера).

Для корректной работы программы использовались следующие системы защиты:

)        Перед тем, как создать сервер (либо подключиться в серверу), пользователю необходимо ввести индивидуальное имя. Цель - предотвращение одинаковых имен в чате. Если не ввести имя, появится соответствующее окно о не вводе имени. Данная проверка изображена на рисунке 6.

Рисунок 6. Проверка ввода имени

2)      Используя функцию (DisabledControl), запрещаем доступ к управлениям при работе приложения в режиме сервера или клиента. Цель запрета - избежать исключения от случайного нажатия "неправильных" кнопок. Данные запреты хорошо видны на рисунках 4,5,6. При создании сервера (либо подключения клиента к серверу), затемняются параметры IP-адреса и номера порта, которые в данном режиме редактировать невозможно.

)        При подключении клиента к серверу, если сервер не создан - появляется соответствующее сообщение (рисунок 7):

Рисунок 7. Проверка на подключения клиента к серверу

При нажатии кнопки архива сообщений, появляется окно истории всех сообщений пользователя (сервера), в зависимости от типа подключения (рисунок 8):

Рисунок 8. Архив сообщений клиента

Заключение

В результате выполнения курсового проекта, получили программу пересылки текстовых сообщений по локальной сети.

Были изучены компоненты классов CAboutDlg, CSock, ChatCppApp, CChatCppDlg и т.д. Ознакомились со специальными методами для работы с этими компонентами, научились обрабатывать реакцию этих компонентов на события, научились эффективно и эстетично использовать рабочее пространство формы и освоились со специфичностью написания программ. VC++ связывает с каждым включаемым в программу окном собственный модуль и таким способом локализует все свойства окна в отдельной программной единице. Выяснили, что основная программа весьма специфична: она содержит перечень всех используемых в программе модулей и несколько исполняемых операторов, обеспечивающих создание нужных окон и связь программы с Windows. Вся основная работа программы управляется кодом, содержащимся в модулях.

Список использованной литературы

1.  Передача данных по сети с помощью СSocket. #"517750.files/image009.gif">

Рисунок 9. Диаграмма классов

Приложение Б

Рисунок 10. Диаграмма прецедентов

Приложение В

Рисунок 11. Диаграмма компонентов

Приложение Г

Рисунок 12. Диаграмма взаимодействий

Приложение Д

Рисунок 13. Диаграмма развёртывания

Приложение Е

Рисунок 14. Протокол тестирования

Похожие работы на - Создание программы обмена текстовыми сообщениями через локальную сеть

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!