Создание программы обмена текстовыми сообщениями через локальную сеть
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
>{();+= " " + 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.
Рисунок 3. Окно сервера
Окно клиента изображено на рисунке 4.
Рисунок 4. Окно клиента
Проверка отправки и прихода сообщений изображено на рисунке 6.
Рисунок 5. Проверка отправки и прихода сообщений
К преимуществам данной программы можно отнести:
)Интуитивно понятный интерфейс;
)Скорость пересылки сообщений на высоком уровне;
)Возможность открытия архива всех сообщений;
)Вся необходимая информация читабельна и находится перед пользователем;
)Отображение (в верхнем левом углу) состояния чата.
Недостатки:
)Отсутствие возможности отправки личного сообщения;
)В случае неработоспособности сервера, клиент не сможет подключиться к сети (для решения данной проблемы обычно используют дублирующие сервера).
Для корректной работы программы использовались следующие системы защиты:
)Перед тем, как создать сервер (либо подключиться в серверу), пользователю необходимо ввести индивидуальное имя. Цель - предотвращение одинаковых имен в чате. Если не ввести имя, появится соответствующее окно о не вводе имени. Данная проверка изображена на рисунке 6.
Рисунок 6. Проверка ввода имени
2)Используя функцию (DisabledControl), запрещаем доступ к управлениям при работе приложения в режиме сервера или клиента. Цель запрета - избежать исключения от случайного нажатия "неправильных" кнопок. Данные запреты хорошо видны на рисунках 4,5,6. При создании сервера (либо подключения клиента к серверу), затемняются параметры IP-адреса и номера порта, которые в данном режиме редактировать невозможно.
)При подключении клиента к серверу, если сервер не создан - появляется соответствующее сообщение (рисунок 7):
Рисунок 7. Проверка на подключения клиента к серверу
При нажатии кнопки архива сообщений, появляется окно истории всех сообщений пользователя (сервера), в зависимости от типа подключения (рисунок 8):
Рисунок 8. Архив сообщений клиента
Заключение
В результ