基于UDP協(xié)議的網(wǎng)上聊天程序范例_第1頁(yè)
基于UDP協(xié)議的網(wǎng)上聊天程序范例_第2頁(yè)
基于UDP協(xié)議的網(wǎng)上聊天程序范例_第3頁(yè)
基于UDP協(xié)議的網(wǎng)上聊天程序范例_第4頁(yè)
基于UDP協(xié)議的網(wǎng)上聊天程序范例_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 湖南工業(yè)大學(xué)課 程 設(shè) 計(jì)資 料 袋 計(jì)算機(jī)與通信學(xué)院 學(xué)院(系、部) 2011 2012 學(xué)年第 1 學(xué)期 課程名稱(chēng) 計(jì)算機(jī)網(wǎng)絡(luò)原理 指導(dǎo)教師 李建設(shè) 職稱(chēng) 副教授 學(xué)生姓名 蔣政 專(zhuān)業(yè)班級(jí) 軟件092 學(xué)號(hào) 題 目 基于UDP協(xié)議網(wǎng)上聊天程序 成 績(jī) 起止日期 2011 年 11 月 24 日 2011 年 12 月 4 日目 錄 清 單序號(hào)材 料 名 稱(chēng)資料數(shù)量備 注1課程設(shè)計(jì)任務(wù)書(shū)2課程設(shè)計(jì)說(shuō)明書(shū)3456課程設(shè)計(jì)任務(wù)書(shū)2010 2011學(xué)年第 2 學(xué)期學(xué)院(系、部) 計(jì)算機(jī)與通信學(xué)院 專(zhuān)業(yè) 軟件工程 班級(jí) 091-3 課程名稱(chēng): 計(jì)算機(jī)網(wǎng)絡(luò)原理 學(xué)生姓名: 蔣政 設(shè)計(jì)題目: 基于UD

2、P協(xié)議網(wǎng)上聊天程序 指導(dǎo)教師: 李建設(shè) 完成期限:自 2011 年 11 月 24 日至 2011 年 12 月 4 日 共 2 周內(nèi)容及任務(wù)一、設(shè)計(jì)內(nèi)容實(shí)現(xiàn)一簡(jiǎn)單的聊天程序?qū)崿F(xiàn)網(wǎng)上聊天,包括服務(wù)器和客戶(hù)端。1. 支持多人聊天。2. 客戶(hù)端具有圖形化用戶(hù)界面。二、設(shè)計(jì)任務(wù)課程設(shè)計(jì)說(shuō)明書(shū)(紙質(zhì)+電子版),內(nèi)容包括:設(shè)計(jì)內(nèi)容、系統(tǒng)分析(包括可行性分析、需求分析等)及功能分析;系統(tǒng)設(shè)計(jì)(要求畫(huà)出系統(tǒng)整體功能框圖、流程圖、并給出相應(yīng)地關(guān)鍵的代碼且對(duì)所使用的主要數(shù)據(jù)結(jié)構(gòu)進(jìn)行說(shuō)明等。)、設(shè)計(jì)總結(jié)(評(píng)價(jià)/遇到的問(wèn)題/體會(huì)/建議等)、使用說(shuō)明等。三、設(shè)計(jì)要求1. 按功能要求開(kāi)發(fā)系統(tǒng),能正確運(yùn)行。程序代碼書(shū)寫(xiě)規(guī)

3、范,有充足的注釋。2. 課程設(shè)計(jì)所使用的編程語(yǔ)言任選,但建議使用C或C+;3. 綠色軟件:程序運(yùn)行不需安裝,避免寫(xiě)系統(tǒng)和注冊(cè)表;進(jìn)度安排起止日期工作內(nèi)容2011-11-242011-11-27選題2011-11-282011-11-29系統(tǒng)分析和設(shè)計(jì);2011-11-302011-12-3熟悉軟件開(kāi)發(fā)工具、編碼系統(tǒng)、系統(tǒng)測(cè)試2011-12-042011-12-05撰寫(xiě)并提交課程設(shè)計(jì)說(shuō)明書(shū) (含電子文檔)、源程序等。主要參考資料1(美) Larry Peterson著,薛靜鋒等譯. 計(jì)算機(jī)網(wǎng)絡(luò):系統(tǒng)方法 (第4版) ,機(jī)械工業(yè)出版社,20092(荷) Andrew S.Tanenbaum著,潘愛(ài)

4、民譯. 計(jì)算機(jī)網(wǎng)絡(luò)(第4版),清華大學(xué)出版社, 20043謝希仁著.計(jì)算機(jī)網(wǎng)絡(luò)(第5版) ,電子工業(yè)出版社, 2008.14 吳功宜等著.計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì),機(jī)械工業(yè)出版社,2005指導(dǎo)教師(簽字): 年 月 日系(教研室)主任(簽字): 年 月 日課程設(shè)計(jì)說(shuō)明書(shū) 課程名稱(chēng): 計(jì)算機(jī)網(wǎng)絡(luò)原理 設(shè)計(jì)題目: 基于UDP協(xié)議的聊天程序 專(zhuān) 業(yè): 軟件工程 班級(jí): 092 學(xué)生姓名: 蔣政 學(xué) 號(hào): 指導(dǎo)教師: 李建設(shè) 年 月 日 目錄 1. 課程設(shè)計(jì)具體實(shí)現(xiàn)過(guò)程. 4 2. 具體代碼的實(shí)現(xiàn) 8 3.注意事項(xiàng). 124.參考文獻(xiàn). 12 一 . 多線(xiàn)程編程聊天程序的具體實(shí)現(xiàn)1 創(chuàng)建MFC-EXE 工程

5、,工程名為 Chat,Dialog based。2 刪除對(duì)話(huà)框控件,添加自己的控件,各個(gè)控件的ID分別為:接受文本框的ID為IDC_EDIT_RECV,發(fā)送數(shù)據(jù)的文本框ID為IDC_EDIT_SEND,發(fā)送按鈕的ID為IDC_BTN_SEND。其余默認(rèn)即可。3 加載套接字庫(kù),進(jìn)行版本協(xié)商MFC環(huán)境下使用 AfxSocketInit(查看MSDN幫助)AfxSocketInit加載的1.1版本,可以確保Socket庫(kù)的釋放MSDN中提到在 CWinApp:InitInstance中使用在這里就是 CChatAPP類(lèi)的InitInstance中調(diào)用if(!AfxSocketInit()AfxMes

6、sageBox("加載套接字庫(kù)失??!");return FALSE;4 剛才使用了 AfxSocketInit 需要加入頭文件#include <Afxsock.h> 放入到 StdAfx.h的頭文件中,StdAfx.h是預(yù)編譯頭文件,包括MFC工程必要的頭文件5 在CChatDlg類(lèi)中定義一個(gè)成員函數(shù),作為套接字初始化工作 BOOL InitSocket()同時(shí)增加一個(gè) 變量 SOCKET m_socket6 實(shí)現(xiàn) InitSocket()m_socket=socket(AF_INET,SOCK_DGRAM,0);if(INVALID_SOCKET=m_soc

7、ket)MessageBox("套接字創(chuàng)建失敗!");return FALSE;SOCKADDR_IN addrSock;addrSock.sin_family=AF_INET;addrSock.sin_port=htons(1234);addrSock.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");int retval;retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR);int retv = WSAGetLastError();if(SO

8、CKET_ERROR=retval)closesocket(m_socket);MessageBox("綁定失敗!");return FALSE;return TRUE;7 在CChatDlg的OnInitDialog()的最后調(diào)用InitSocket()8 下面編寫(xiě)接收端程序(1)當(dāng)接受數(shù)據(jù)時(shí)如果沒(méi)有數(shù)據(jù)到來(lái),recvfrom函數(shù)會(huì)阻塞,從而導(dǎo)致進(jìn)程暫停運(yùn)行,所以采用線(xiàn)程來(lái)完成 (2)創(chuàng)建線(xiàn)程后,我們需要傳遞兩個(gè)參數(shù),一個(gè)是套接字,一個(gè)是對(duì)話(huà)框的句柄(接受編輯框的句柄),這樣可以通過(guò)套接字接受數(shù)據(jù),傳給接受編輯框,但CreateThread只能傳遞一個(gè)參數(shù)(第四個(gè)),但是

9、個(gè)指針9 在 CChatDlg的頭文件中 定義一個(gè)結(jié)構(gòu)體struct RECVPARAMSOCKET sock;HWND hwnd; /注意這里的分號(hào)10 在CChatDlg的OnInitDialog()最后,即InitSocket()后RECVPARAM *pRecvParam=new RECVPARAM;pRecvParam->sock=m_socket;pRecvParam->hwnd=m_hWnd;HANDLE hThread=CreateThread (NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);CloseHandle(hThre

10、ad);return TRUE;11 加入線(xiàn)程函數(shù),從MSDN中COPY加入一個(gè)全局函數(shù),有的單位要求不允許使用全局函數(shù),那這里加給 CChatDlg類(lèi),作為一個(gè)成員函數(shù)DWORD WINAPI RecvProc (LPVOID lpParameter)12此時(shí)程序報(bào)錯(cuò),因?yàn)橐獔?zhí)行 RecvProc 需要CChatDlg的實(shí)例,不能在類(lèi)中調(diào)用,所以報(bào)錯(cuò)解決方法:在CChatDlg頭文件中,將RecvProc函數(shù)定義為static類(lèi)型13 實(shí)現(xiàn)線(xiàn)程函數(shù)SOCKET sock=(RECVPARAM*)lpParameter)->sock;HWND hwnd=(RECVPARAM*)lpPar

11、ameter)->hwnd;delete lpParameter;SOCKADDR_IN addrFrom;int len=sizeof(SOCKADDR);char recvBuf200;char tempBuf300;int retval;while(TRUE)retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);if(SOCKET_ERROR=retval)break;sprintf(tempBuf,"%s說(shuō): %s",inet_ntoa(addrFrom.sin_addr),

12、recvBuf);:PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf); /發(fā)送數(shù)據(jù) 傳送一個(gè)自定義消息,傳給窗口return 0;14 加入消息相應(yīng)機(jī)制(1)在CChatDlg的頭文件中 定義消息值,加入#defineWM_RECVDATAWM_USER+1(2)做一個(gè)消息相應(yīng)函數(shù)原型的聲明在CChatDlg的頭文件的下方的 protected聲明中加入afx_msg void OnRecvData(WPARAM wParam,LPARAM lParam); /注意加入了兩個(gè)參數(shù),因?yàn)镻ostMessage發(fā)送消息的過(guò)程中傳遞了參數(shù)(3)加入消息映

13、射:注意因?yàn)镃AboutDlg類(lèi)和CChatDlg類(lèi)在一個(gè)CPP文件中,所以消息映射一定要加正確了找到 BEGIN_MESSAGE_MAP(CChatDlg, CDialog)在最后面寫(xiě)入: ON_MESSAGE(WM_RECVDATA,OnRecvData)第一個(gè)參數(shù)是 消息本身:WM_RECVDATA第二個(gè)參數(shù)是 消息相應(yīng)函數(shù):OnRecvData注意后面不要加分號(hào)(4)最后是消息相應(yīng)函數(shù)的實(shí)現(xiàn)在 CPP最后加入void CChatDlg:OnRecvData(WPARAM wParam,LPARAM lParam)15實(shí)現(xiàn)剛才加入的 OnRecvData 消息相應(yīng)函數(shù)CString st

14、r=(char*)lParam;CString strTemp;/獲取舊文本GetDlgItemText(IDC_EDIT_RECV,strTemp); str+="rn" /增加一個(gè)換行str+=strTemp;SetDlgItemText(IDC_EDIT_RECV,str);/放到編輯框16雙擊發(fā)送按鈕,系統(tǒng)自動(dòng)生成按鈕相應(yīng)事件(1) 首先要獲取IP,查看MSDN幫助CIPAddressCtrlCIPAddressCtrl對(duì)應(yīng)的就是IP控件,通過(guò)一個(gè)DWORD類(lèi)型的變量來(lái)接受IP地址首先得到控件的指針:GetDlgItem(IDC_IPADDRESS1)強(qiáng)制轉(zhuǎn)換為 (

15、CIPAddressCtrl*)類(lèi)型最后調(diào)用CIPAddressCtrl下的一個(gè)函數(shù)GetAddress完整的程序是DWORD dwIP;( (CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1) )->GetAddress(dwIP);(2) 得到IP地址后,可以發(fā)送數(shù)據(jù),繼續(xù)在后面加入代碼SOCKADDR_IN addrTo;addrTo.sin_family=AF_INET;addrTo.sin_port=htons(1234);addrTo.sin_addr.S_un.S_addr=htonl(dwIP);CString strSend;GetDl

16、gItemText(IDC_EDIT_SEND,strSend);sendto(m_socket,strSend , strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR);SetDlgItemText(IDC_EDIT_SEND,"");17 此時(shí)發(fā)現(xiàn) 文本框并沒(méi)有 換行顯示選擇 接收數(shù)據(jù)的文本框控件,右鍵選擇屬性,在Styles中選擇 Multiline就可以了;18 為了讓我們回車(chē)就發(fā)送數(shù)據(jù),可以設(shè)置發(fā)送按鈕為缺省按鈕,可以右鍵選擇按鈕屬性,在在Styles中選擇 Default button就可

17、以了。 二 . 具體代碼的實(shí)現(xiàn)CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cx

18、Icon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CChartDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;BOOL CChartDlg:InitSoc

19、ket()m_socket=socket(AF_INET,SOCK_DGRAM,0);if(INVALID_SOCKET=m_socket)MessageBox("套接字創(chuàng)建失??!");return FALSE;SOCKADDR_IN addrSock;addrSock.sin_family=AF_INET;addrSock.sin_port=htons(1234);addrSock.sin_addr.S_un.S_addr=inet_addr(GethostIP();int retval;retval=bind(m_socket,(SOCKADDR*)&addrS

20、ock,sizeof(SOCKADDR);int retv = WSAGetLastError();if(SOCKET_ERROR=retval)closesocket(m_socket);MessageBox("綁定失敗!");return FALSE;return TRUE;DWORD WINAPI CChartDlg:RecvProc(LPVOID lpParameter)SOCKET sock=(RECVPARAM*)lpParameter)->sock;HWND hwnd=(RECVPARAM*)lpParameter)->hwnd;delete lp

21、Parameter;SOCKADDR_IN addrFrom;int len=sizeof(SOCKADDR);char recvBuf200;char tempBuf300;int retval;while(TRUE)retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);if(SOCKET_ERROR=retval)break;sprintf(tempBuf,"%s說(shuō): %s",inet_ntoa(addrFrom.sin_addr),recvBuf);:PostMessage(hwnd

22、,WM_RECVDATA,0,(LPARAM)tempBuf); /發(fā)送數(shù)據(jù) 傳送一個(gè)自定義消息,傳給窗口return 0;void CChartDlg:OnRecvData(WPARAM wParam,LPARAM lParam)CString str=(char*)lParam;CString strTemp;/獲取舊文本GetDlgItemText(IDC_EDIT_RECV,strTemp); if(strTemp!="")strTemp+="rn" /增加一個(gè)換行strTemp+=str;SetDlgItemText(IDC_EDIT_RECV

23、,strTemp);(CEdit*)GetDlgItem(IDC_EDIT_RECV)->LineScroll(CEdit*)GetDlgItem(IDC_EDIT_RECV)->GetLineCount();void CChartDlg:OnButtonSend() / TODO: Add your control notification handler code hereDWORD dwIP;( (CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1) )->GetAddress(dwIP);SOCKADDR_IN addrTo;addrT

24、o.sin_family=AF_INET;addrTo.sin_port=htons(1234);addrTo.sin_addr.S_un.S_addr=htonl(dwIP);CString strSend;GetDlgItemText(IDC_EDIT_SEND,strSend);sendto(m_socket,strSend , strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR);SetDlgItemText(IDC_EDIT_SEND,"");CString strTemp;CString str="我說(shuō):"+strSend;/獲取舊文本GetDlgItemText(IDC_EDIT_RECV,strTemp); if(strTemp!="")strTemp+="rn" /增加一個(gè)換行strTemp+=str;SetDlgItemText(IDC_EDIT_RECV,strTemp);(CEdit*)GetDlgItem(IDC_EDIT_RECV)->Line

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論