Всё сдал! - помощь студентам онлайн Всё сдал! - помощь студентам онлайн

Реальная база готовых
студенческих работ

Узнайте стоимость индивидуальной работы!

Вы нашли то, что искали?

Вы нашли то, что искали?

Да, спасибо!

0%

Нет, пока не нашел

0%

Узнайте стоимость индивидуальной работы

это быстро и бесплатно

Получите скидку

Оформите заказ сейчас и получите скидку 100 руб.!


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

Тип Реферат
Предмет Информатика
Просмотров
877
Размер файла
345 б
Поделиться

Ознакомительный фрагмент работы:

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

Содержание:

1. Введение……………………………………………………………3

2. Инструментальное обеспечение для обмена текстовыми

сообщениями……………………………………………….……...4

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

сообщениями…………………………...........................................5

4. Программная реализация сетевой технологии обмена

текстовыми сообщениями в программе ………………………...8

5. Результаты работы программы…………………………………...25

6. Преимущества и недостатки приложения……………………….27

7. Заключение………………………………………………………...28

8. Список литературы………………………………………………..29

1.Введение

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

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

Специализированный язык CBuilder предназначен для разработки интерфейсов (процедур ввода-вывода с экрана монитора, клавиатуры и др. внешних устройств).Эти интерфейсы могут работать как с приложениями, написанными на языке C++, так и на других языках.

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

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

библиотеки стандартных компонентов, шаблонов, инструментов;

комплект документации, и инструкций (help).

Ключевой особенностью программирования под CBuilder является использование технологии Drag-and-Drop, позволяющей программисту формировать код будущего интерфейса, двигая по экрану монитора указанные “мышью” стандартные объекты.

CBuilder существенно облегчает разработку программных продуктов систем управления базами данных.

Таким образом, CBuilder существенно снижает трудозатраты программиста на написание интерфейса и систем управления базами данных.

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


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

TClientSocket manages socket connections for a TCP/IP client.

UnitScktcomp

Syntax

[C++] class TClientSocket : public Scktcomp::TCustomSocket

Description Add a TClientSocket object to a form or data module to turn an application into a TCP/IP client. TClientSocket specifies a desired connection to a TCP/IP server, manages the connection when it is open, and terminates the connection when the application is through.

TServerSocket manages server socket connections for a TCP/IP server.

UnitScktcomp

Syntax

[C++] class TServerSocket : public Scktcomp::TCustomServerSocket

Description Add a TServerSocket object to a form or data module to turn an application into a TCP/IP server. TServerSocket listens for requests for TCP/IP connections from other machines, and establishes connections when requests are received.

TTrayIcon Class Creates an icon in the system tray next to the clock.

DescriptionUse the TTrayIcon component to create an icon in the system tray next to the clock. TTrayIcon has events for mouse clicks, properties for menus and animation of the icon, and methods for showing balloon hints.
3.Разработка архитектуры программы для обмена текстовыми сообщениями

Задачей нашей программы является обмен текстовыми сообщениями через локальную сеть. Для работы с сетью я выбрал компоненты TServerSocket и TClientSocket. Это клиент-серверные компоненты – один компонент ожидает соединения, а другой с ним соединяется. К серверному компоненту могут подключаться сразу несколько клиентских, что позволяет нам создать многопользовательскую программы для обмена текстовыми сообщениями.

Программа включает в себя клиентскую и серверную часть.

Чтобы начать обмен текстовыми сообщениями, на одном из компьютеров локальной сети должна быть запущена копия программы в серверном режиме. Необходимые для этого операции я приводить не буду т.к. интуитивный интерфейс программы не даст никому ошибиться. После того как на одном из компьютеров будет запущен сервер, к нему могут подключаться клиентские компьютеры.

Возможно, кому-то покажется интересной схема отсылки сообщения всем участникам «чата». Если кто то из «клиентов» отправляет сообщение, оно , естественно, доставляется серверу. Сервер же, получив сообщение от одного из клиентов, отправляет ее всем участникам «чата» , которые в свою очередь увидят входящее сообщение в поле Memo окна «чата».

Рис. 1


4.Программная реализация сетевой технологии обмена текстовыми сообщениями в программе

Исходный код главной формы

#include "stdafx.h"

#include "ChatCppDlg.h"

#include ".chatcppdlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

enum { IDD = IDD_ABOUTBOX };

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

// Implementation

protected:

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

END_MESSAGE_MAP()

// CChatCppDlg dialog

CChatCppDlg::CChatCppDlg(CWnd* pParent /*=NULL*/)

: CDialog(CChatCppDlg::IDD, pParent)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CChatCppDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

DDX_Control(pDX, IDC_RADIO_SERVER, m_ButtonStartServer);

DDX_Control(pDX, IDC_RADIO_CLIENT, m_ButtonStartClient);

DDX_Control(pDX, IDC_EDIT_NAME, m_wndName);

DDX_Control(pDX, IDC_EDIT_IP, m_wndIPAddress);

DDX_Control(pDX, IDC_EDIT_PORT, m_wndPort);

DDX_Control(pDX, IDC_EDIT_SEND, m_wndSend);

DDX_Control(pDX, IDC_BUTTON_SEND, m_ButtonSend);

DDX_Control(pDX, IDC_BUTTON_STOPCHAT, m_ButtonStopChat);

DDX_Control(pDX, IDC_EDIT_CHAT, m_wndChat);

DDX_Control(pDX, IDC_STATIC_COUNTPEOPLE, m_wndCountPeople);

}

BEGIN_MESSAGE_MAP(CChatCppDlg, CDialog)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

//}}AFX_MSG_MAP

ON_BN_CLICKED(IDC_RADIO_SERVER, OnBnClickedRadioServer)

ON_BN_CLICKED(IDC_RADIO_CLIENT, OnBnClickedRadioClient)

ON_BN_CLICKED(IDC_BUTTON_STOPCHAT, OnBnClickedButtonStopchat)

ON_BN_CLICKED(IDC_BUTTON_SEND, OnBnClickedButtonSend)

ON_WM_CLOSE()

END_MESSAGE_MAP()

// CChatCppDlg message handlers

BOOL CChatCppDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

//////////////////////////////////////////////////////////////////////////////

// Необходимая инициализация

SetWindowText("Нет сети!");

m_wndName.SetLimitText(12); // Ограничение количества вводимых символов.

m_wndName.SetWindowText(g_EmptyName);

m_wndSend.SetLimitText(200); // Ограничение количества вводимых символов.

m_wndIPAddress.SetWindowText("127.0.0.1"); // Адрес по умолчанию для тестирования.

m_wndPort.SetWindowText("500"); // Порт по умолчанию.

m_ButtonStopChat.SetWindowText(g_strExitFromChat);

m_mainSocket.m_pParent = this;

return TRUE; // return TRUE unless you set the focus to a control

}

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

{

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

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// If you add a minimize button to your dialog, you will need the code below

// to draw the icon. For MFC applications using the document/view model,

// this is automatically done for you by the framework.

void CChatCppDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

// The Системные вызовы эта функция, чтобы получить курсор, чтобы показать, в то время как пользователь тянется

// минимизировать окно.

HCURSORCChatCppDlg::OnQueryDragIcon()

{

return static_cast<HCURSOR>(m_hIcon);

}

////////////////////////////////////////////// БЛОК 1////////////////////////////////////////////////////////////

// Запускаем сервер

void CChatCppDlg::OnBnClickedRadioServer()

{

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

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

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

// очень неудобно если в чате все будут под одинаковыми именами.

if(m_ButtonStartServer.GetCheck() != BST_CHECKED) return;

if(m_mainSocket.m_hSocket != INVALID_SOCKET) return;

if(QueryName() == false)

{

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

StopChat();

return;

}

CString strPort;

m_wndPort.GetWindowText(strPort);

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

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

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

// atoi конвертирует строку ansitoint

if(m_mainSocket.Create(atoi(strPort)) == FALSE)

{

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

StopChat();

}

else

{

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

if(m_mainSocket.Listen() == FALSE)

{

StopChat();

}

else

{

// Если все в порядке.

DisabledControl(true);

SetWindowText("Сервер ждет подключения!");

// В чате только сервер.

m_wndCountPeople.SetWindowText("В чате 1 чел.");

}

}

}

/////////////////////////////////////////////////////////// БЛОК 1////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////// БЛОК 2////////////////////////////////////////////////////////////////

// Запускаем клиента

voidCChatCppDlg::OnBnClickedRadioClient()

{

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

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

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

// очень неудобно если в чате все будут под одинаковыми именами..

if(m_ButtonStartClient.GetCheck() != BST_CHECKED) return;

if(m_mainSocket.m_hSocket != INVALID_SOCKET) return;

if(QueryName() == false)

{

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

StopChat();

return;

}

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

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

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

if(m_mainSocket.Create() == TRUE)

{

CString strAddress;

m_wndIPAddress.GetWindowText(strAddress);

CString strPort;

m_wndPort.GetWindowText(strPort);

if(m_mainSocket.Connect(strAddress, atoi(strPort)) == FALSE)

{

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

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

// т.е. практически успешный возврат.

if(GetLastError() == WSAEWOULDBLOCK)

{

DisabledControl(false);

}

else

{

// Если какая-либо ошибка возникла,

// приводим приложение в первоначальное состояние,

// готовым к следующей попытке создания соединения.

StopChat();

}

}

}

}

/////////////////////////////////////////////////////////// БЛОК 2////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////БЛОК 1.1////////////////////////////////////////////////////////////////

// Нажали кнопку "Выйти из чата".

void CChatCppDlg::OnBnClickedButtonStopchat()

{

StopChat();

}

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

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

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

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

void CChatCppDlg::DisabledControl(bool server)

{

// Запреты.

m_wndIPAddress.EnableWindow(FALSE);

m_wndPort.EnableWindow(FALSE);

m_ButtonSend.EnableWindow(FALSE);

if(server == true)

{

m_ButtonStopChat.SetWindowText(g_strStopChat);

m_ButtonStartClient.EnableWindow(FALSE);

}

else

{

m_ButtonStopChat.SetWindowText(g_strExitFromChat);

m_ButtonStartServer.EnableWindow(FALSE);

}

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

// Разрешить возможность выхода из чата.

m_ButtonStopChat.EnableWindow(TRUE);

}

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

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

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

void CChatCppDlg::EnabledControl(void)

{

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

m_wndIPAddress.EnableWindow(TRUE);

m_wndPort.EnableWindow(TRUE);

m_ButtonStartClient.EnableWindow(TRUE);

m_ButtonStartServer.EnableWindow(TRUE);

// Запреты.

m_ButtonStopChat.EnableWindow(FALSE);

m_ButtonSend.EnableWindow(FALSE);

}

/////////////////////////////////////////////////////////БЛОК 1.1////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////БЛОК 1.2////////////////////////////////////////////////////////////////

// Принимаем запросы на подключения

void CChatCppDlg::OnAccept(void)

{

CSock* pSock = new CSock;

pSock->m_pParent = this;

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

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

if(m_mainSocket.Accept(*pSock) == TRUE)

{

m_vecSockets.push_back(pSock);

m_ButtonSend.EnableWindow(TRUE);

SendCountPeople();

}

else

delete pSock;

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

}

/////////////////////////////////////////////////////////БЛОК 1.2////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////БЛОК 1.3////////////////////////////////////////////////////////////////

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

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

// то это полная остановка чата.

// Для более надежной работы чата, во всех

// приложениях должны быть запущеня дублирующие серверы...

voidCChatCppDlg::StopChat(void)

{

// Отсылаем сигнал об отключении от чата.

SendDisconnect();

m_mainSocket.Close();

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

{

m_vecSockets[i]->Close();

delete m_vecSockets[i];

}

// Очистим вектор от ненужных элементов.

m_vecSockets.clear();

m_ButtonStartServer.SetCheck(BST_UNCHECKED);

m_ButtonStartClient.SetCheck(BST_UNCHECKED);

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

// повторных попыток.

EnabledControl();

// В чате нет никого.

m_wndCountPeople.SetWindowText("В чате 0 чел.");

SetWindowText("Нет сети!");

}

/////////////////////////////////////////////////////////БЛОК 1.3////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////БЛОК 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) + "rn";

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) + ": Чат остановлен!" + "rn";

}

else

{

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

}

m_wndChat.SetWindowText(strChat);

int number_line = m_wndChat.GetLineCount();

m_wndChat.LineScroll(number_line);

}

break;

default:

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

break;

}

}

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

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

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

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

voidCChatCppDlg::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) + "rn";

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) + ": " + "Чат остановлен!" + "rn";

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)

{

int countpeople = 1/*сервер*/ + (int)m_vecSockets.size()/*клиенты*/;

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

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

// Отправим сообщение о количествах людей в чате.

SENDBUFFER sb;

sb.typemessage = m_TypeMessage::tmCountPeople;

sb.countpeople = countpeople;

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

{

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

}

}

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

/////////////////////////////////////////////////////////БЛОК 1.7////////////////////////////////////////////////////////////////

// Запрос имени чатующего перед созданием сокета.

bool CChatCppDlg::QueryName(void)

{

CString strName;

m_wndName.GetWindowText(strName);

if(strName == g_EmptyName || strName.IsEmpty() == true)

returnfalse;

returntrue;

}

/////////////////////////////////////////////////////////БЛОК 1.7////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////БЛОК 3//////////////////////////////////////////////////////////////////

Исходный код инициализацию сокета:

#include "stdafx.h"

#include "ChatCpp.h"

#include "ChatCppDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// CChatCppApp

BEGIN_MESSAGE_MAP(CChatCppApp, CWinApp)

ON_COMMAND(ID_HELP, CWinApp::OnHelp)

END_MESSAGE_MAP()

// CChatCppApp construction

CChatCppApp::CChatCppApp()

{

// TODO: add construction code here,

// Place all significant initialization in InitInstance

}

// The one and only CChatCppApp object

CChatCppApp theApp;

// CChatCppApp initialization

BOOL CChatCppApp::InitInstance()

{

//InitCommonControls () требуется на WindowsXP, если прикладная декларация //определяет использование ComCtl32.dll версии 6 или позже позволить визуальные стили.

//Иначе, любое создание окна потерпит неудачу.

InitCommonControls();

CWinApp::InitInstance();

AfxEnableControlContainer();

if (!AfxSocketInit())

{

AfxMessageBox("Нет инициализации сокета!");

return FALSE;

}

CChatCppDlg dlg;

m_pMainWnd = &dlg;

INT_PTR nResponse = dlg.DoModal();

if (nResponse == IDOK)

{

// TODO: Place code here to handle when the dialog is

// dismissed with OK

}

else if (nResponse == IDCANCEL)

{

// TODO: Place code here to handle when the dialog is

// dismissed with Cancel

}

// Since the dialog has been closed, return FALSE so that we exit the

// application, rather than start the application's message pump.

return FALSE;

}

/////////////////////////////////////////////////////////БЛОК 3////////////////////////////////////////////////////////////////

СОКЕТ:

#include "stdafx.h"

#include "ChatCppDlg.h"

#include "Sock.h"

CSock::CSock()

: m_pParent(NULL)

{

}

CSock::~CSock()

{

}

/////////////////////////////////////////////////////////БЛОК 3.1////////////////////////////////////////////////////////////////

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

void CSock::OnConnect(int nErrorCode)

{

CChatCppDlg* pDlg = (CChatCppDlg*)m_pParent;

nErrorCode == 0 ? pDlg->OnConnect(FALSE) : pDlg->OnConnect(TRUE);

CAsyncSocket::OnConnect(nErrorCode);

}

/////////////////////////////////////////////////////////БЛОК 3.1////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////БЛОК 3.2////////////////////////////////////////////////////////////////

// Событие отключения от сети

void CSock::OnClose(int nErrorCode)

{

Beep(2000, 300);

CAsyncSocket::OnClose(nErrorCode);

}

/////////////////////////////////////////////////////////БЛОК 3.2////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////БЛОК 3.3////////////////////////////////////////////////////////////////

// Событие возможности получения сообщений.

void CSock::OnReceive(int nErrorCode)

{

CChatCppDlg* pDlg = (CChatCppDlg*)m_pParent;

pDlg->OnReceive();

CAsyncSocket::OnReceive(nErrorCode);

}

/////////////////////////////////////////////////////////БЛОК 3.3////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////БЛОК 3.4////////////////////////////////////////////////////////////////

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

// Происходит на стороне серверного приложения.

void CSock::OnAccept(int nErrorCode)

{

CChatCppDlg* pDlg = (CChatCppDlg*)m_pParent;

pDlg->OnAccept();

CAsyncSocket::OnAccept(nErrorCode);

}

/////////////////////////////////////////////////////////БЛОК 3.4////////////////////////////////////////////////////////////////

5.Результат работы программы.

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

Окно первого запуска

Окно сервера и окно клиента

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

6.Преимущества и недостатки приложения.

Программа обмена текстовыми сообщениями получилась простой, без большого количества дополнительных функций. Приятный интерфейс интуитивно понятен. Из дополнительных возможностей можно отменить выбор цвета и других атрибутов для отправляемых сообщений. Также на главной форме есть ползунок, с помощью которого мы можем сделать нашу программу прозрачной, на тот случай если это кому-нибудь когда-нибудь пригодится. Еще одним достоинством программы является то, что ее можно написать самому за пару часов, если у Вас вдруг (по странному стечению обстоятельств) под рукой не будет ни одной другой прогммы по обмену текстовыми сообщениями. Программу также можно свернуть в трей, что тоже иногда бывает очень полезным.

К минусам программы можно отнести почти полную неконкурентоспособность – почти на любом компьютере установлен NetMeeting, поставляемый с Windows, а сторонними разработчиками выпущено много других, еще более удобных и функциональных программ для обмена текстовыми сообщениями. Хотя возможно кто то найдет изюминку именно в этой программе, и она станет для него самым удобным и функциональным – о вкусах не спорят.

7.Заключение

При выполнении данной курсовой работы были освоены основы визуального программирования, получены навыки работы с интегрированной средой разработчика и интерфейсом среды визуального программирования C++Builder.

Также в процессе выполнения курсового проекта были изучены компоненты классов TForm, TLabel, TMemo, TBitBtn, TScrollBox, TButton, TPopupMenu, TActionList, TMainmenu, TPanel, TBevel, TTrayIcon, TStringGrid и другие . Мы ознакомились со специальными методами для работы с этими компонентами, научились обрабатывать реакцию этих компонентов на события, научились эффективно и эстетично использовать рабочее пространство формы и освоились со специфичностью написания программ на C++Builder(модульность).

Стало ясно, что роль модулей в C++Builder. не исчерпывается только механизмом раздельной компиляции. C++Builder. связывает с каждым включаемым в программу окном собственный модуль и таким способом локализует все свойства окна в отдельной программной единице. Выяснили, что основная программа весьма специфична: она содержит перечень всех используемых в программе модулей и несколько исполняемых операторов, обеспечивающих создание нужных окон и связь программы с Windows. Вся основная работа программы управляется кодом, содержащимся в модулях.

8.Список литературы

1. Фаронов В. В. DelphiПрограммирование на языке высокого уровня. – М.: «ПИТЕР», 2006. – 639 с.

2. Камилова А. М. Методические указания для выполнения лабораторных работ по дисциплине «Среды визуального программирования», обе части.

3. Конспекты лекций по предмету «Среды визуального программирования», преподаватель Камилова А. М.

4. Баженова И. Ю. «Delphi6 Самоучитель программиста», Кудиц-Образ, Москва, 2002.-345 с.


Нет нужной работы в каталоге?

Сделайте индивидуальный заказ на нашем сервисе. Там эксперты помогают с учебой без посредников Разместите задание – сайт бесплатно отправит его исполнителя, и они предложат цены.

Цены ниже, чем в агентствах и у конкурентов

Вы работаете с экспертами напрямую. Поэтому стоимость работ приятно вас удивит

Бесплатные доработки и консультации

Исполнитель внесет нужные правки в работу по вашему требованию без доплат. Корректировки в максимально короткие сроки

Гарантируем возврат

Если работа вас не устроит – мы вернем 100% суммы заказа

Техподдержка 7 дней в неделю

Наши менеджеры всегда на связи и оперативно решат любую проблему

Строгий отбор экспертов

К работе допускаются только проверенные специалисты с высшим образованием. Проверяем диплом на оценки «хорошо» и «отлично»

1 000 +
Новых работ ежедневно
computer

Требуются доработки?
Они включены в стоимость работы

Работы выполняют эксперты в своём деле. Они ценят свою репутацию, поэтому результат выполненной работы гарантирован

avatar
Математика
История
Экономика
icon
159599
рейтинг
icon
3275
работ сдано
icon
1404
отзывов
avatar
Математика
Физика
История
icon
156450
рейтинг
icon
6068
работ сдано
icon
2737
отзывов
avatar
Химия
Экономика
Биология
icon
105734
рейтинг
icon
2110
работ сдано
icon
1318
отзывов
avatar
Высшая математика
Информатика
Геодезия
icon
62710
рейтинг
icon
1046
работ сдано
icon
598
отзывов
Отзывы студентов о нашей работе
63 457 оценок star star star star star
среднее 4.9 из 5
Тгу им. Г. Р. Державина
Реферат сделан досрочно, преподавателю понравилось, я тоже в восторге. Спасибо Татьяне за ...
star star star star star
РЭУ им.Плеханово
Альберт хороший исполнитель, сделал реферат очень быстро, вечером заказала, утром уже все ...
star star star star star
ФЭК
Маринаааа, спасибо вам огромное! Вы профессионал своего дела! Рекомендую всем ✌🏽😎
star star star star star

Последние размещённые задания

Ежедневно эксперты готовы работать над 1000 заданиями. Контролируйте процесс написания работы в режиме онлайн

Подогнать готовую курсовую под СТО

Курсовая, не знаю

Срок сдачи к 7 дек.

только что
только что

Выполнить задания

Другое, Товароведение

Срок сдачи к 6 дек.

1 минуту назад

Архитектура и организация конфигурации памяти вычислительной системы

Лабораторная, Архитектура средств вычислительной техники

Срок сдачи к 12 дек.

1 минуту назад

Организации профилактики травматизма в спортивных секциях в общеобразовательной школе

Курсовая, профилактики травматизма, медицина

Срок сдачи к 5 дек.

2 минуты назад

краткая характеристика сбербанка анализ тарифов РКО

Отчет по практике, дистанционное банковское обслуживание

Срок сдачи к 5 дек.

2 минуты назад

Исследование методов получения случайных чисел с заданным законом распределения

Лабораторная, Моделирование, математика

Срок сдачи к 10 дек.

4 минуты назад

Проектирование заготовок, получаемых литьем в песчано-глинистые формы

Лабораторная, основы технологии машиностроения

Срок сдачи к 14 дек.

4 минуты назад

2504

Презентация, ММУ одна

Срок сдачи к 7 дек.

6 минут назад

выполнить 3 задачи

Контрольная, Сопротивление материалов

Срок сдачи к 11 дек.

6 минут назад

Вам необходимо выбрать модель медиастратегии

Другое, Медиапланирование, реклама, маркетинг

Срок сдачи к 7 дек.

7 минут назад

Ответить на задания

Решение задач, Цифровизация процессов управления, информатика, программирование

Срок сдачи к 20 дек.

7 минут назад
8 минут назад

Все на фото

Курсовая, Землеустройство

Срок сдачи к 12 дек.

9 минут назад

Разработка веб-информационной системы для автоматизации складских операций компании Hoff

Диплом, Логистические системы, логистика, информатика, программирование, теория автоматического управления

Срок сдачи к 1 мар.

10 минут назад
11 минут назад

перевод текста, выполнение упражнений

Перевод с ин. языка, Немецкий язык

Срок сдачи к 7 дек.

11 минут назад
planes planes
Закажи индивидуальную работу за 1 минуту!

Размещенные на сайт контрольные, курсовые и иные категории работ (далее — Работы) и их содержимое предназначены исключительно для ознакомления, без целей коммерческого использования. Все права в отношении Работ и их содержимого принадлежат их законным правообладателям. Любое их использование возможно лишь с согласия законных правообладателей. Администрация сайта не несет ответственности за возможный вред и/или убытки, возникшие в связи с использованием Работ и их содержимого.

«Всё сдал!» — безопасный онлайн-сервис с проверенными экспертами

Используя «Свежую базу РГСР», вы принимаете пользовательское соглашение
и политику обработки персональных данных
Сайт работает по московскому времени:

Вход
Регистрация или
Не нашли, что искали?

Заполните форму и узнайте цену на индивидуальную работу!

Файлы (при наличии)

    это быстро и бесплатно