Разработка программы для обмена тестовыми сообщениями

Автор: Пользователь скрыл имя, 11 Апреля 2011 в 17:46, курсовая работа

Описание работы

Техническое задание: разработать программу для обмена тестовыми сообщениями.
В настоящее время значительная часть программных продуктов написана на языке C++. Увеличение количества персональных ЭВМ в 80-90 гг. и вовлечение большого количества неквалифицированных пользователей в непосредственную работу на ЭВМ способствовало развитию операционных систем типа Windows. Эти операционные системы предполагают организацию процедур ввода-вывода не так как системы DOS.

Содержание

1. Введение……………………………………………………………3
2. Инструментальное обеспечение для обмена текстовыми
сообщениями……………………………………………….……...4
3. Разработка архитектуры программы для обмена текстовыми
сообщениями…………………………...........................................5
4. Программная реализация сетевой технологии обмена
текстовыми сообщениями в программе ………………………...8
5. Результаты работы программы…………………………………...25
6. Преимущества и недостатки приложения……………………….27
7. Заключение………………………………………………………...28
8. Список литературы………………………………………………..29

Работа содержит 1 файл

Курсовая СВП.doc

— 487.50 Кб (Скачать)

/////////////////////////////////////////////////////////БЛОК 2.1//////////////////////////////////////////////////////////////// 

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

void CChatCppDlg::OnBnClickedButtonSend()

{

      CString strChat;

      m_wndSend.GetWindowText(strChat);

      SendChat(strChat); 

}

/////////////////////////////////////////////////////////БЛОК 2.1//////////////////////////////////////////////////////////////// 
 
 

/////////////////////////////////////////////////////////БЛОК 1.4//////////////////////////////////////////////////////////////// 

// Извлечение сообщений  из сети чата.

void CChatCppDlg::OnReceive(void)

{

      SENDBUFFER sb;

      if(m_ButtonStartServer.GetCheck() == BST_CHECKED)

      {

            // Сервер несет большую  нагрузку при получении  сообщений.

            for(int index = 0; index < (int)m_vecSockets.size(); index++)

            {

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

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

                  // из списка доступных  клиентов.

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

                  {

                        m_vecSockets[index]->Close();

                        delete m_vecSockets[index];

                        m_vecSockets.erase(m_vecSockets.begin() + index); 

                        SendCountPeople(); 

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

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

// сети только через  сервер.

                        SendBuffer(sb, false); 

                        break;

                  }

                  // Рассылаем сообщения  клиента по сети  чата.

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

                  {

                        SendBuffer(sb, false);

                        break;

                  }

            } 

      }

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

      {

            m_mainSocket.Receive(&sb, sizeof(SENDBUFFER));

      } 

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

      // его типа.

      switch(sb.typemessage)

      {

      case m_TypeMessage::tmCountPeople:

            {

                  m_wndCountPeople.SetWindowText("В  чате " +

                        IntToStr(sb.countpeople) + " чел.");

            }

            break;

      case m_TypeMessage::tmChat:

            {

                  CString strChat;

                  m_wndChat.GetWindowText(strChat);

                  strChat += "    " + CString(sb.name) + ": " + CString(sb.buffer) + "\r\n";

                  m_wndChat.SetWindowText(strChat);

                  int number_line = m_wndChat.GetLineCount();

                  m_wndChat.LineScroll(number_line);

            }

            break;

      case m_TypeMessage::tmDisconnect:

            {

                  CString strChat;

                  m_wndChat.GetWindowText(strChat); 

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

// изменим содержимое  сообщения.

                  if(sb.stopchat == true)

                  {

                        StopChat();

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

                  }

                  else

                  {

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

                  }

                  m_wndChat.SetWindowText(strChat);

                  int number_line = m_wndChat.GetLineCount();

                  m_wndChat.LineScroll(number_line); 
 

            }

            break;

      default:

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

            break;

      }

} 

/////////////////////////////////////////////////////////БЛОК 1.4//////////////////////////////////////////////////////////////// 

/////////////////////////////////////////////////////////БЛОК 1.5//////////////////////////////////////////////////////////////// 

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

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

void CChatCppDlg::OnClose()

{

      StopChat(); 

      CDialog::OnClose();

} 

// Послать строку-сообщение  в чат.

void CChatCppDlg::SendChat(CString strMessage)

{

      SENDBUFFER sb;

      int len = strMessage.GetLength();

      memcpy(sb.buffer, strMessage.GetBuffer(), sizeof(TCHAR)*len);

      m_wndName.GetWindowText(strMessage);

      len = strMessage.GetLength();

      memcpy(sb.name, strMessage.GetBuffer(), sizeof(TCHAR)*len);

      sb.typemessage = m_TypeMessage::tmChat; 

      SendBuffer(sb, true);

} 

// Послать буфер подготовленного сообщения в сеть.

void CChatCppDlg::SendBuffer(SENDBUFFER sb, bool toserver)

{

      // Если слкет не создан, нечего  делать в этой функции.

      if(m_mainSocket.m_hSocket == INVALID_SOCKET) return; 

      if(m_ButtonStartServer.GetCheck() == BST_CHECKED)

      {

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

            {

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

                  if(send == sizeof(SENDBUFFER))

                  {

                        m_wndSend.SetWindowText("");

                  }

            } 

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

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

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

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

            if(toserver == true )

            {

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

                  {

                        CString strChat;

                        m_wndChat.GetWindowText(strChat);

                        strChat += "    " + CString(sb.name) + ": " + CString(sb.buffer)  + "\r\n";

                        m_wndChat.SetWindowText(strChat);

                        int number_line = m_wndChat.GetLineCount();

                        m_wndChat.LineScroll(number_line);

                  }

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

                  {

                        CString strChat;

                        m_wndChat.GetWindowText(strChat);

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

                        m_wndChat.SetWindowText(strChat);

                        int number_line = m_wndChat.GetLineCount();

                        m_wndChat.LineScroll(number_line);

                  }

            } 

      }

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

      {

            int send = m_mainSocket.Send(&sb, sizeof(SENDBUFFER));

            if(send == sizeof(SENDBUFFER))

                  m_wndSend.SetWindowText("");

      }

} 
 

// Формируем и отправляем  сообщение об отключении  от сети.

void CChatCppDlg::SendDisconnect(void)

{

      SENDBUFFER sb;

      CString s;

      m_wndName.GetWindowText(s);

      int len = s.GetLength();

      memcpy(sb.name, s.GetBuffer(), sizeof(TCHAR)*len);

      sb.typemessage = m_TypeMessage::tmDisconnect; 

      // Отсоединение сервера останавливает  чат.

      if(m_ButtonStartServer.GetCheck() == BST_CHECKED)

            sb.stopchat = true; 

      SendBuffer(sb, true); 

}

/////////////////////////////////////////////////////////БЛОК 1.5//////////////////////////////////////////////////////////////// 
 

/////////////////////////////////////////////////////////БЛОК 2.2//////////////////////////////////////////////////////////////// 

// Событие подключения,  происходит на стороне клиента.

void CChatCppDlg::OnConnect(BOOL Error)

{

      if(Error == TRUE)

      {

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

            StopChat();

      }

      else

      {

            m_ButtonSend.EnableWindow(TRUE);

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

      }

}

/////////////////////////////////////////////////////////БЛОК 2.2//////////////////////////////////////////////////////////////// 

/////////////////////////////////////////////////////////БЛОК 1.6////////////////////////////////////////////////////////////////

// Сервер отправляет  клиентам количество  людей в чате.

void CChatCppDlg::SendCountPeople(void)

Информация о работе Разработка программы для обмена тестовыми сообщениями