1. 程式人生 > >c++語言應用------基於visual studio的聊天軟體的實現

c++語言應用------基於visual studio的聊天軟體的實現

本博文介紹了使用c++語言實現基於visual studio的聊天程式。

相關的project連結為

(伺服器的下載請仔細看資源描述)

請使用visual studio2012及其以上的版本開啟,否則可能發生錯誤。

相關分析:

1.課題目標和主要內容

課題目標:通過動手操作,可以從最初理解通訊協議的抽象概念,逐步過渡到可以使用協議,按照協議編譯程式實現所需功能,並進一步能夠設計簡單的協議

主要內容:在理解網際網路協議和Socket的基礎上,自行設計簡單的應用層協議,設計並程式設計實現網路聊天軟體。

開發平臺:visual studio2012

主要工具:C++語言

2.系統的主要功能   

功能

簡要說明

生成一個簡單的Windows視窗

建立win32程式

生成Windows視窗程式框架

客戶端呼叫伺服器並登陸

建立傳送資訊的通道,在此基礎上可以互發資訊

互發聊天資訊

通過回車可以互相傳送字元等簡單的聊天內容

斷開連線

斷開通道,不能互發資訊

改變字型顏色

改變顯示在對話方塊裡的字型顏色

自動回覆

可以自動回覆自己寫下的內容

開啟外部應用程式

可以開啟QQ、百度等

清除歷史記錄

清除歷史紀錄框內的訊息記錄

快捷鍵退出

通過設定組合鍵Ctrl+D退出對話方塊

其他功能

在實驗報告中有詳敘

3.

關鍵演算法分析

(1) 實驗必做功能,即基礎功能是伺服器和客戶端之間能夠進行簡單的對話,包括髮送簡單的文字和其他簡單的字元等。

1.傳送資訊

伺服器端通過傳送按鈕下的函voidCChatServerDlg::OnBnClickedSend()來實現將寫在編輯框中的字元傳送到客戶端(客戶端通過傳送按鈕下的函式voidCChatClientDlg::OnBnClickedSend()),這個函式一方面將資訊傳送到對方,同時將資訊新增到list控制元件即對話方塊中的歷史記錄框中,並完成對編輯框的重新整理,使得編輯框能夠重新輸入新的字元。

2.接收資訊

伺服器端通過CServerSocket類中的:函式

void OnAccept(int nErrorCode)將來自對方的資訊翻譯成相應的字元並寫進歷史記錄對話方塊中(客戶端實現相同的功能則是通過CMySocket類中的函式void OnReceive(intnErrorCode)實現相同的功能

3.注意細節

要想完成對話方塊能夠接發信息的功能,首先要將客戶端和伺服器端通過ip地址連線在一起,若在同一臺電腦上實現此功能,則只需要將地址設定為本機地址127.0.0.1即可實現連線,同時要注意埠的匹配,否則不能實現正確的連線,當按下斷開按鈕之後,傳送資訊的通道斷開,不能再發送資訊。

(2) 附加功能,即在基礎功能上新增的使得對話方塊功能更加強大的其他用處

功能一:同過按下回車鍵即可傳送資訊,相當於給傳送按鈕添加了回車這個快捷鍵

實現地方:客戶端和伺服器端

實現方法:滑鼠右擊回車按鈕->屬性改為true,然後回到對話方塊,ctrl+D對話框出現如下所示:


滑鼠左擊回車,回車數字變為1即可

功能二:組合鍵ctrl+X退出對話方塊

實現地方:伺服器端

實現方法:過載函式BOOLCChatServerDlg::PreTranslateMessage(MSG*pMsg),通過判斷虛擬鍵GetKeyState(VK_CONTROL) < 0是否被按下(小於0代表被按下),然後即可新增程式碼if(pMsg->wParam == 'X')來實現組合鍵的觸發(此處和功能一的功能類似,但是實現方法大不相同)

功能三:改變字型顏色

實現地方:客戶端和伺服器端

(1) 客戶端:逐行改變字型的顏色

實現方法:自定義一個派生自CListBox的類CColorListBox,新增函式int AddString(LPCTSTR lpszItem,COLORREF itemColor =RGB(255,0,0));這個函式實現的是將字串以特定的顏色寫進控制元件,例如m_list.AddString(temp1,RGB(a,b,c));就是將字串temp1abc三個數混合形成的顏色寫進控制元件m_list.效果如下:


當然此處需要新增控制元件CComboBox cWordColor;裡面寫的是可以選擇的顏色,效果如圖所示


(2) 伺服器端:以控制元件為單位,整體改變控制元件裡面字型的顏色

實現方法:在類裡面新增函式HBRUSHCChatServerDlg::OnCtlColor(CDC*pDC, CWnd*pWnd, UINTnCtlColor),並通過呼叫控制元件的idif語句來判斷是否在指定控制元件中寫入字元,如if(IDC_LIST1==pWnd->GetDlgCtrlID())就是判斷list控制元件即歷史紀錄框是否在使用,並以語句pDC->etTextColor(RGB(0,0,255)來給控制元件設定顏色,效果如下


與客戶端不同,此處是通過按鈕來改變選擇字型顏色的。另外客戶端和伺服器端的編輯框都是通過這種方法來改變字型顏色的。

功能四:開啟外部exe應用程式

實現地方:伺服器端

實現方法:通過函式ShellExecute來呼叫外部應用程式,例如開啟qq程式碼:ShellExecute(NULL,"open","C:\\ProgramFiles(x86)\\Tencent\\QQ\\QQProtect\\Bin\\QQProtect.exe",NULL,NULL,SW_SHOWNORMAL);注意此處的qq的路徑中單斜槓寫成雙斜槓才是正確的

功能五:開啟相應的網站

實現地方:伺服器端

實現方法:和上述功能相似,也是用函式ShellExecute來實現的,不同的是在寫應用程式路徑的地方寫成相應的網址即可,例如開啟百度的程式碼為:ShellExecute(NULL,"open","http://www.baidu.com",NULL, NULL, SW_SHOWNORMAL);

功能六:實現自動回覆的功能

實現地方:客戶端

實現方法:在類CMySocket中新增語句

if(dlg->autosend==true)

       {

       dlg->m_autosend.GetWindowTextA(dlg->buff,200);

CString temp1=":";

CString formatbuff="#c#s#"+(CString)"[自動回覆]"+(CString)dlg->buff;

       (*dlg->m_client).Send(formatbuff,200,0);

CString str;

       dlg->m_tm=CTime::GetCurrentTime();

       str=dlg->m_tm.Format("%X");

       temp1=str+" "+temp1+"[自動回覆]"+(CString)dlg->buff;

       dlg->m_list.AddString(temp1);

       dlg->m_list.UpdateData(FALSE);

      }

其中autosend是按鈕下的一個bool變數,以它來作為是否要實現自動回覆的功能,此處自動回覆的內容寫在編輯框中,通過GetWindowTextA來獲取併發送給對方,同時寫進客戶端的歷史記錄框中

效果如下:


功能七:清除歷史記錄

實現地方:客戶端和伺服器端

實現方法:在清除歷史記錄的按鈕下,新增函式 m_list.ResetContent ();函式代表將m_list控制元件重置內容,相當於清除了歷史記錄,效果如下:

原狀態:


按下清除歷史記錄的按鈕後:


4.程式執行結果分析

伺服器端:

客戶端:

 

備註:

在使用時,先啟動伺服器,然後再啟動客戶端連線到伺服器。

若在同一臺電腦上同時啟動伺服器和客戶端,則客戶端裡面的IP地址可以填寫為本機的IP地址或者是127.0.0.1

若在不同的電腦上啟動伺服器和客戶端,則客戶端裡面填寫的IP只能是伺服器電腦的IP地址。