《QQ聊天系統(tǒng)》畢業(yè)設(shè)計(jì)說(shuō)明書(shū)_第1頁(yè)
《QQ聊天系統(tǒng)》畢業(yè)設(shè)計(jì)說(shuō)明書(shū)_第2頁(yè)
《QQ聊天系統(tǒng)》畢業(yè)設(shè)計(jì)說(shuō)明書(shū)_第3頁(yè)
《QQ聊天系統(tǒng)》畢業(yè)設(shè)計(jì)說(shuō)明書(shū)_第4頁(yè)
《QQ聊天系統(tǒng)》畢業(yè)設(shè)計(jì)說(shuō)明書(shū)_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

PAGEPAGEIPAGEI簡(jiǎn)單QQ聊天系統(tǒng)摘要目前網(wǎng)絡(luò)通訊是計(jì)算機(jī)用戶進(jìn)行交流最普遍的方式,各種各樣基于網(wǎng)絡(luò)的應(yīng)用也隨之誕生,比如“騰訊QQ”——一款基于Internet的即時(shí)通信(IM)軟件,它使人們能隨時(shí)在網(wǎng)上與其他用戶交換消息,為網(wǎng)絡(luò)用戶提供一個(gè)即時(shí)交流聊天的平臺(tái)。本設(shè)計(jì)主要是仿照QQ聊天系統(tǒng),實(shí)現(xiàn)兩個(gè)用戶進(jìn)行即時(shí)交談的功能,為進(jìn)一步開(kāi)發(fā)即時(shí)通信技術(shù)應(yīng)用奠定基礎(chǔ)。該程序設(shè)計(jì)采用了客戶端/服務(wù)器模式,基于TCP面向連接的方式,實(shí)現(xiàn)用戶之間一對(duì)一的數(shù)據(jù)傳輸。用到的關(guān)鍵技術(shù)有套接字Socket、單線程技術(shù)等,是在VisualC#2008語(yǔ)言下進(jìn)行編程的。本論文將介紹該聊天程序的相關(guān)功能、特點(diǎn)、設(shè)計(jì)思路及其使用方法,通過(guò)相關(guān)的插圖詳細(xì)介紹整個(gè)程序的開(kāi)發(fā)過(guò)程及其具體實(shí)現(xiàn),并總結(jié)開(kāi)發(fā)過(guò)程中的經(jīng)驗(yàn)等。關(guān)鍵詞即時(shí)通信、套接字Socket、單線程目錄第1章緒論 11.1 引言 11.1.1編寫(xiě)目的 11.1.2 背景 11.2 課題意義 11.3 研究現(xiàn)狀 2第2章系統(tǒng)分析概述 32.1 可行性研究 32.1.1 技術(shù)可行性 32.1.2 經(jīng)濟(jì)可行性 32.1.3 操作可行性 32.2 系統(tǒng)分析 32.2.1 功能要求 32.2.2 系統(tǒng)流程圖 3第3章總體設(shè)計(jì) 53.1 體系結(jié)構(gòu)設(shè)計(jì) 53.2 功能簡(jiǎn)介 53.2.1 服務(wù)器工作流程 53.2.2 客戶端工作流程 63.3 系統(tǒng)特點(diǎn) 6第4章詳細(xì)設(shè)計(jì) 74.1 系統(tǒng)的開(kāi)發(fā)工具 74.2 服務(wù)器模塊設(shè)計(jì) 74.2.1服務(wù)器登錄模塊 74.2.2服務(wù)器聊天模塊 9 聊天模塊控件屬性表 10 聊天模塊代碼 114.3 客戶端模塊設(shè)計(jì) 174.3.1客戶端登錄模塊 174.3.2客戶端聊天模塊 19結(jié)論 28參考文獻(xiàn) 29緒論引言隨著互聯(lián)網(wǎng)應(yīng)用越來(lái)越豐富,以快速、交互、簡(jiǎn)便為代表的即時(shí)通訊工具,已經(jīng)成為當(dāng)前網(wǎng)絡(luò)用戶最喜愛(ài)的網(wǎng)絡(luò)溝通工具。作為即時(shí)通訊工具最具增長(zhǎng)潛力之一的聊天軟件,不僅在基礎(chǔ)應(yīng)用方面,還是產(chǎn)品擴(kuò)展應(yīng)用方面都將有質(zhì)的飛躍,極大程度上方便了處于在世界各地的友人之間的相互聯(lián)系。特別是在近幾年,即時(shí)通訊工具已經(jīng)成為一個(gè)集互動(dòng)交流、休閑娛樂(lè)、信息管理為一體的多元化互聯(lián)網(wǎng)應(yīng)用平臺(tái)??傊?,聊天軟件的出現(xiàn)給人們彼此之間的溝通帶來(lái)了無(wú)比的方便,人們可以通過(guò)聊天軟件建立深刻的友情,它必定會(huì)成為人們網(wǎng)絡(luò)生活不可缺少的一部分。1.1.1編寫(xiě)目的綜合運(yùn)用計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)用編程中的TCP網(wǎng)絡(luò)通信協(xié)議以及Socket套接字等知識(shí),以VisualC#作為開(kāi)發(fā)平臺(tái),編寫(xiě)一個(gè)單線程聊天程序。本程序需要在一臺(tái)計(jì)算機(jī)上運(yùn)行服務(wù)器端程序,然后就可以在同一網(wǎng)絡(luò)的另外一臺(tái)計(jì)算機(jī)上運(yùn)行客戶端程序,登錄到服務(wù)器上,從而實(shí)現(xiàn)服務(wù)器與用戶之間的即時(shí)聊天、發(fā)送圖片等功能。背景◆項(xiàng)目名稱:簡(jiǎn)單的單線程QQ聊天系統(tǒng)◆項(xiàng)目用戶:***◆開(kāi)發(fā)者:***課題意義一直以來(lái),空間上的距離都是人們彼此相互交流的最大障礙。以前人們的信息交流是通過(guò)電話、信件、電報(bào)等手段,由于功能的局限給收發(fā)雙方帶來(lái)了很多不便。所以更加即時(shí)的直觀的使人們能在網(wǎng)上識(shí)別在線用戶并與他們實(shí)時(shí)交換消息的即時(shí)通信技術(shù)應(yīng)運(yùn)而生,它是電子郵件發(fā)明以來(lái)迅速崛起的在線通訊方式,為網(wǎng)絡(luò)用戶提供一個(gè)實(shí)時(shí)交流聊天的平臺(tái)。而且即時(shí)通信和社會(huì)化網(wǎng)絡(luò)、統(tǒng)一通信、在線協(xié)同三大技術(shù)熱點(diǎn)的關(guān)系將越來(lái)越密切,已經(jīng)構(gòu)成融合發(fā)展的趨勢(shì),因此即時(shí)通信技術(shù)的應(yīng)用將越來(lái)越廣泛,越來(lái)越普遍。研究現(xiàn)狀即時(shí)消息系統(tǒng)[1](InstantMessenger,IM)是一種在后PC時(shí)代興起的,以Internet網(wǎng)絡(luò)為基礎(chǔ)的,允許交互雙方即時(shí)地傳送文字、語(yǔ)音、視頻等信息,能夠跟蹤網(wǎng)絡(luò)用戶在線狀態(tài)的網(wǎng)絡(luò)應(yīng)用軟件。即時(shí)消息系統(tǒng)產(chǎn)生有著深刻的社會(huì)原因:人們都有渴望社交,獲得社會(huì)尊重、實(shí)現(xiàn)自我的需求,這正是即時(shí)消息軟件風(fēng)行的原動(dòng)力,而物質(zhì)文明的日益發(fā)達(dá)所帶來(lái)副作用,又使得人們習(xí)慣與周圍的人保持距離,以致人們更愿意對(duì)陌生人敞開(kāi)心扉,在網(wǎng)絡(luò)中可以跨越年齡、身份、行業(yè)、地域的限制,達(dá)到人與人、人與信息之間的零距離交流。從這點(diǎn)上講,即時(shí)消息系統(tǒng)的出現(xiàn)改變了人們的溝通方式和交友文化,大大拓展了個(gè)人生活交流的空間。國(guó)內(nèi)最為流行的即時(shí)消息軟件是OICQ(簡(jiǎn)稱QQ)。它以良好的中文界面和不斷增強(qiáng)的功能形成了一定的QQ網(wǎng)絡(luò)文化。該軟件是由騰訊公司于1999年2月自主開(kāi)發(fā)的基于Internet的即時(shí)消息系統(tǒng)。騰訊QQ目前已成為中國(guó)最主要的即時(shí)消息服務(wù)網(wǎng)絡(luò)軟件。作為一種即時(shí)消息工具,QQ支持顯示好友在線、即時(shí)傳送文字、語(yǔ)音和文件等功能。QQ還與無(wú)線尋呼、GSM短信息、IP電話網(wǎng)互聯(lián),為用戶提供互聯(lián)網(wǎng)短信及信息增值服務(wù)。騰訊QQ開(kāi)發(fā)和拓展統(tǒng)一、高速、豐富的互聯(lián)網(wǎng)應(yīng)用平臺(tái)、在線廣告業(yè)務(wù)、移動(dòng)通信業(yè)務(wù)、ISP及IP電話合作業(yè)務(wù)、企業(yè)商用即時(shí)消息服務(wù)、在線客戶支持及在線呼叫業(yè)務(wù)。系統(tǒng)分析概述可行性研究技術(shù)可行性隨著互聯(lián)網(wǎng)應(yīng)用越來(lái)越豐富,以快速、交互、簡(jiǎn)便為代表的即時(shí)通訊工具,已經(jīng)成為當(dāng)前網(wǎng)絡(luò)用戶最喜愛(ài)的網(wǎng)絡(luò)溝通工具。本系統(tǒng)是一個(gè)使用套接字Socket編程,采用其中的TCP面向連接方式的簡(jiǎn)單的聊天工具,具有很強(qiáng)的實(shí)用價(jià)值。經(jīng)濟(jì)可行性開(kāi)發(fā)本系統(tǒng)能夠使人們之間的交流帶來(lái)極大的方便,而且所用的人力、物力、技術(shù)、資金等的花費(fèi)不大,所以今后獲得的經(jīng)濟(jì)效益一定會(huì)大于開(kāi)發(fā)成本。操作可行性本開(kāi)發(fā)系統(tǒng)操作步驟簡(jiǎn)單,運(yùn)行時(shí)只要在登錄時(shí)輸入服務(wù)器信息以及自己的昵稱就可以進(jìn)入聊天程序,然后就可以與服務(wù)器進(jìn)行信息交流。系統(tǒng)分析功能要求ⅰ.客戶端登錄時(shí)輸入的服務(wù)器信息必須與服務(wù)端一致。ⅱ.用戶與服務(wù)器之間的信息發(fā)送,是本程序需要實(shí)現(xiàn)的最基本的功能。ⅲ.在C/S模式中,服務(wù)器和客戶端是相互依賴的。服務(wù)器啟動(dòng)以后,客戶端才能連接上服務(wù)器,如果服務(wù)器沒(méi)有啟動(dòng),那么用戶和服務(wù)器不能連接而且客戶端或服務(wù)器任意一方斷開(kāi)連接,對(duì)方都會(huì)能接收到通知消息。系統(tǒng)流程圖登錄登錄服務(wù)器啟動(dòng)監(jiān)聽(tīng)器等待接受客戶端連接讀取客戶端數(shù)據(jù)向客戶端寫(xiě)數(shù)據(jù)斷開(kāi)連接登錄客戶端準(zhǔn)備Socket連接服務(wù)器向服務(wù)器寫(xiě)數(shù)據(jù)讀取服務(wù)器數(shù)據(jù)斷開(kāi)連接返回返回總體設(shè)計(jì)體系結(jié)構(gòu)設(shè)計(jì)通常的通信工具,都采用客戶機(jī)/服務(wù)器(C/S)體系結(jié)構(gòu),C/S結(jié)構(gòu)是這樣的一種結(jié)構(gòu):它包括一個(gè)客戶機(jī)(或前端),一個(gè)服務(wù)器(或稱后端),客戶機(jī)的作用是訪問(wèn)和處理遠(yuǎn)程服務(wù)器上的數(shù)據(jù),服務(wù)器的作用是接收和處理客戶機(jī)的數(shù)據(jù)請(qǐng)求。另外它的服務(wù)器端還可以將信息集中起來(lái),任何客戶機(jī)都可以通過(guò)訪問(wèn)服務(wù)器而獲得所需的信息。Client/Server模型最終可歸結(jié)為一種“請(qǐng)求/應(yīng)答”關(guān)系。一個(gè)請(qǐng)求總是首先被客戶發(fā)出,然后服務(wù)器總是被動(dòng)地接收請(qǐng)求,返回客戶需要的結(jié)果。在客戶發(fā)出一個(gè)請(qǐng)求之前,服務(wù)進(jìn)程一直處于休眠狀態(tài)。一個(gè)客戶提出請(qǐng)求后,服務(wù)進(jìn)程被“喚醒”并且為客戶提供服務(wù),對(duì)客戶的請(qǐng)求做出所需要的應(yīng)答。如下圖所示:服務(wù)器客戶端服務(wù)器客戶端在服務(wù)器啟動(dòng)以后,等待客戶端的連接,當(dāng)有客戶連接上來(lái)以后,服務(wù)器監(jiān)聽(tīng)到客戶端的端口號(hào),然后客戶端顯示連接成功到服務(wù)器,以告知服務(wù)器自己在線,然后服務(wù)器和客戶端就可以進(jìn)行信息交流。如果服務(wù)器不在線,則客戶端會(huì)提示用戶退出。功能簡(jiǎn)介本聊天程序提供了服務(wù)器與客戶端的一對(duì)一連接,客戶端必須在服務(wù)器啟動(dòng)以后才能連接成功。用戶登錄以后聊天室的客戶端會(huì)顯示用戶的登錄昵稱和在線時(shí)間,還可以與服務(wù)器進(jìn)行即時(shí)聊天、發(fā)送圖片等。服務(wù)器工作流程⑴.服務(wù)器輸入IP地址和端口號(hào),點(diǎn)擊“登錄”按鈕,服務(wù)器登錄聊天室。⑵.點(diǎn)擊控制臺(tái)的“啟動(dòng)”按鈕,服務(wù)器開(kāi)始偵聽(tīng),等待客戶端連接。⑶.如果有用戶連接上來(lái),服務(wù)器可以與用戶進(jìn)行信息傳輸、發(fā)送圖片等。⑷.點(diǎn)擊“斷開(kāi)”按鈕,服務(wù)器將停止端口偵聽(tīng),并通知用戶。⑸.點(diǎn)擊“退出”按鈕,服務(wù)器將退出聊天程序。客戶端工作流程⑴.用戶輸入服務(wù)器的IP地址和端口號(hào)以及自己的昵稱后,點(diǎn)擊“登錄”按鈕,用戶將登錄聊天室。⑵.點(diǎn)擊控制臺(tái)的“連接”按鈕,如果連接成功,用戶將通過(guò)剛剛輸入的昵稱連接上服務(wù)器,并通知服務(wù)器連接成功。⑶.連接成功后,用戶可以與服務(wù)器進(jìn)行信息傳輸、發(fā)送圖片等。⑷.當(dāng)用戶點(diǎn)擊“斷開(kāi)”按鈕,客戶端將斷開(kāi)與服務(wù)器的連接,并通知服務(wù)器斷開(kāi)連接。⑸.用戶點(diǎn)擊“退出”按鈕時(shí),將退出聊天程序。系統(tǒng)特點(diǎn)界面設(shè)計(jì)美觀友好。規(guī)范、完整的基礎(chǔ)信息設(shè)置。能夠即時(shí)進(jìn)行通信聊天。系統(tǒng)運(yùn)行穩(wěn)定、安全可靠。詳細(xì)設(shè)計(jì)系統(tǒng)的開(kāi)發(fā)工具4.1.1開(kāi)發(fā)環(huán)境--VisualStudio是微軟公司出品的一款大型應(yīng)用軟件,是一套完整的開(kāi)發(fā)工具集,它主要用于生成ASP.NETWeb應(yīng)用程序、XMLWebServices、桌面應(yīng)用程序和移動(dòng)應(yīng)用程序。4.1.2C#(CSharp)是微軟(Microsoft)為.NETFramework量身訂做的程序語(yǔ)言,C#擁有C/C++的強(qiáng)大功能以及VisualBasic簡(jiǎn)易使用的特性,是第一個(gè)組件導(dǎo)向(Component-oriented)的程序語(yǔ)言,和C++與Java一樣亦為對(duì)象導(dǎo)向(object-oriented)程序語(yǔ)言。服務(wù)器模塊設(shè)計(jì)4.2.1服務(wù)器登錄模塊登錄模塊界面服務(wù)器進(jìn)入登錄界面(如圖4-2-1)后,設(shè)置IP地址和端口號(hào),點(diǎn)擊“登錄”按鈕,系統(tǒng)將驗(yàn)證輸入的服務(wù)器信息是否合法,如果服務(wù)器信息合法則跳轉(zhuǎn)到聊天室,否則將彈出錯(cuò)誤提示窗口(如圖4-2-2)。如果未設(shè)置服務(wù)器信息,則彈出信息提示窗口(如圖4-2-3);點(diǎn)擊“重置”按鈕,服務(wù)器信息圖4-2-圖4-2-2圖4-2-3登錄模塊控件屬性表控件屬性值控件成員變量TextBoxtxtIPTextBoxtxtPortButton登錄btnLogButton重置btnResent登錄模塊代碼//登錄聊天室privatevoidbtnLog_Click(objectsender,EventArgse){if(txtIP.Text==""||txtPort.Text==""){MessageBox.Show("請(qǐng)輸入IP地址或端口號(hào)!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning,MessageBoxDefaultButton.Button1);return;}else{try{IPAddressipadd=IPAddress.Parse(this.txtIP.Text);intport=Convert.ToInt32(this.txtPort.Text);tab2.Visible=true;tab1.Visible=false;this.btnImgFile.Enabled=false;this.Text="服務(wù)器"+DateTime.Now.ToString()+""+DateTime.Now.DayOfWeek.ToString();richTextBox1.AppendText("System:服務(wù)器已進(jìn)入聊天室!<-"+DateTime.Now.ToLongTimeString()+"->\r\n");stringSerIp=txtIP.Text.ToString();stringSerPort=txtPort.Text.ToString();labip.Text="IP地址:"+""+SerIp+"";labport.Text="端口號(hào):"+""+SerPort;}catch(Exception){MessageBox.Show("您輸入的IP地址或端口號(hào)不正確,\n請(qǐng)重新輸入!","錯(cuò)誤",MessageBoxButtons.OK,MessageBoxIcon.Error);}}}//重置服務(wù)器信息privatevoidbtnResent_Click_1(objectsender,EventArgse){txtIP.Clear();txtPort.Clear();}4.2.2服務(wù)器聊天模塊聊天模塊界面服務(wù)器進(jìn)入聊天室后,狀態(tài)欄顯示服務(wù)器登錄時(shí)輸入的IP地址和端口號(hào)。點(diǎn)擊“啟動(dòng)”按鈕,服務(wù)器開(kāi)始監(jiān)聽(tīng),如果有用戶連接上來(lái),服務(wù)器可以與用戶進(jìn)行聊天(如圖4-2-4另外聊天室的工具欄還有一些輔助按鈕,點(diǎn)擊“背景顏色”按鈕,設(shè)置聊天記錄的背景顏色(如圖4-2-5);點(diǎn)擊“隱藏窗口”按鈕,隱藏聊天程序;點(diǎn)擊“幫助”按鈕,彈出幫助對(duì)話框(如圖4-2-6圖4-2-圖4-2-圖4-2-聊天模塊控件屬性表控件屬性值控件成員變量Button啟動(dòng)(&L)btn_startButton斷開(kāi)(&S)btn_stopButton退出(&E)btn_ExitButton背景顏色(&C)btnColoButton隱藏窗口(&Y)btnYingButton幫助(&H)btnHelpedButton關(guān)于(&A)btnAboutButton發(fā)送圖片btnImgFileButton清屏btnClearButton發(fā)送btn_sendButton取消btnRestRichTextBoxrichTextBox1RichTextBoxtxt1_sendinfoLabelIP地址:labipLabel端口號(hào):labport聊天模塊代碼publicpartialclassChatServer:Form{privateOpenFileDialogopenfiledialog=newOpenFileDialog();privateSaveFileDialogsavefiledialog=newSaveFileDialog();privatebyte[]img;//傳輸圖片用字節(jié)數(shù)組privateintimgflag=0;privateFileStreamfstream;publicdelegatevoidUpdateRichTextBox(stringmsg);//異步委托代理publicdelegatevoidUpdateImg(Streams);privateSocketsocket;//服務(wù)器端套接字privateSocketclientSocket;//客戶端連接套接字privateThreadthread;//啟動(dòng)服務(wù)器,開(kāi)始監(jiān)聽(tīng)privatevoidbtn_start_Click(objectsender,EventArgse){try{IPAddressip=IPAddress.Parse(this.txtIP.Text);IPEndPointserver=newIPEndPoint(ip,Int32.Parse(this.txtPort.Text));//創(chuàng)建服務(wù)器套接字socket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);socket.Bind(server);//綁定端口號(hào)socket.Listen(10);thread=newThread(newThreadStart(AcceptMessage));thread.Start();//開(kāi)始監(jiān)聽(tīng)this.Text="服務(wù)器Taking";richTextBox1.Clear();richTextBox1.AppendText("System:服務(wù)器已啟動(dòng)!<-"+DateTime.Now.ToLongTimeString()+"->\r\n");btnImgFile.Enabled=true;btn_start.Enabled=false;btn_stop.Enabled=true;}catch(Exceptionex){MessageBox.Show("服務(wù)器:"+ex.Message);this.btn_start.Enabled=true;}}//接收客戶端信息publicvoidAcceptMessage()//異步接收信息后臺(tái)線程方法{this.clientSocket=socket.Accept();this.richTextBox1.Clear();richTextBox1.AppendText("System:服務(wù)器連接成功!<-"+DateTime.Now.ToLongTimeString()+"->\r\n");while(true){try{if(this.clientSocket==null||this.clientSocket.Connected==false)break;NetworkStreamnetStream=newNetworkStream(this.clientSocket);//通過(guò)clientSocket對(duì)象獲取NetworkStream對(duì)象//得到一條消息的長(zhǎng)度byte[]dataSize=newbyte[4];netStream.Read(dataSize,0,4);intsize=System.BitConverter.ToInt32(dataSize,0);//循環(huán)接收直到一條完整的消息全部讀入到字節(jié)數(shù)組中byte[]message=newbyte[size];intdataleft=size;intstart=0;if(size>0){while(dataleft>0){intrecv=netStream.Read(message,start,dataleft);start+=recv;dataleft-=recv;}if(message[0]==101)//101代表傳輸圖片{MemoryStreamms=newMemoryStream(message,1,message.Length-1);richTextBox1.BeginInvoke(newUpdateImg(ViewImg),newobject[]{ms});}else//默認(rèn)進(jìn)行普通傳輸{stringMsg=System.Text.Encoding.Unicode.GetString(message,1,message.Length-1);this.richTextBox1.BeginInvoke(newUpdateRichTextBox(UpdateMessage),newobject[]{Msg});}}Thread.Sleep(100);}catch(System.Net.Sockets.SocketExceptionse){MessageBox.Show("服務(wù)器:"+se.Message);}}}//點(diǎn)擊“發(fā)送”按鈕privatevoidbtn_send_Click(objectsender,EventArgse){if(txt1_sendinfo.Text==""){MessageBox.Show("請(qǐng)先輸入內(nèi)容!");txt1_sendinfo.Clear();txt1_sendinfo.Focus();return;}if(imgflag==1){//發(fā)送圖片時(shí)byte[]imgSize=newbyte[4];//將32位整數(shù)值轉(zhuǎn)換為字節(jié)數(shù)組imgSize=System.BitConverter.GetBytes(img.Length+1);//其中加1是因?yàn)楹竺媪艘粋€(gè)101做分隔符try{NetworkStreamnetStream=newNetworkStream(clientSocket);netStream.Write(imgSize,0,4);netStream.WriteByte(101);//分隔符netStream.Write(img,0,img.Length);netStream.Flush();this.richTextBox1.SelectionColor=Color.SteelBlue;this.richTextBox1.AppendText("服務(wù)器<-"+DateTime.Now.ToLongTimeString()+"->:\r\n");this.richTextBox1.SelectionStart=this.richTextBox1.Text.Length;Clipboard.SetDataObject(Image.FromStream(fstream));richTextBox1.Paste();this.richTextBox1.SelectionColor=Color.SteelBlue;this.richTextBox1.AppendText("\n");fstream.Flush();fstream.Close();//此流必須在這里才可以消除txt1_sendinfo.Paste();this.richTextBox1.SelectionStart=this.richTextBox1.Text.Length;this.richTextBox1.Focus();this.txt1_sendinfo.Text="";this.txt1_sendinfo.Focus();imgflag=0;//復(fù)原return;//不執(zhí)行后面的傳輸文本信息}catch(System.Exceptionex){MessageBox.Show("服務(wù)器:"+ex.Message);}}//發(fā)送文本信息時(shí)this.richTextBox1.SelectionColor=Color.SteelBlue;stringstr="服務(wù)器<-"+DateTime.Now.ToLongTimeString()+"->:\r\n"+txt1_sendinfo.Text;inti=str.Length;if(i==0){return;}else{//因?yàn)閟tr為Unicode編碼,每個(gè)字符占2個(gè)字節(jié),所以實(shí)際字節(jié)數(shù)應(yīng)為字符個(gè)數(shù)*2i*=2;}byte[]dataSize=newbyte[4];//將32位整數(shù)值轉(zhuǎn)換為字節(jié)數(shù)組dataSize=System.BitConverter.GetBytes(i+1);//其中加1是因?yàn)楹竺鎸?xiě)了一個(gè)1做分隔符byte[]sendbytes=System.Text.Encoding.Unicode.GetBytes(str);try{NetworkStreamnetStream=newNetworkStream(clientSocket);netStream.Write(dataSize,0,4);netStream.WriteByte(1);//分隔符netStream.Write(sendbytes,0,sendbytes.Length);netStream.Flush();richTextBox1.SelectionColor=Color.SteelBlue;this.richTextBox1.AppendText(str+"\n");this.richTextBox1.SelectionStart=this.richTextBox1.Text.Length;this.richTextBox1.Focus();this.txt1_sendinfo.Rtf="";this.txt1_sendinfo.Focus();}catch(System.Exceptionex){MessageBox.Show("服務(wù)器:"+ex.Message);}}//斷開(kāi)連接privatevoidbtn_stop_Click(objectsender,EventArgse){socket.Close();thread.Abort();thread.Join(10);this.btn_start.Enabled=true;btn_stop.Enabled=false;this.btnImgFile.Enabled=false;this.Text="服務(wù)器"+DateTime.Now.ToString()+""+DateTime.Now.DayOfWeek.ToString();this.richTextBox1.AppendText("System:服務(wù)器斷開(kāi)連接!<-"+DateTime.Now.ToLongTimeString()+"->\r\n");}//接收文本privatevoidUpdateMessage(stringstrmsg)//將異步接收到的信息顯示在富文本框里{this.richTextBox1.SelectionColor=Color.LightCoral;this.richTextBox1.AppendText(strmsg+"\n");this.richTextBox1.SelectionStart=this.richTextBox1.Text.Length;this.richTextBox1.Focus();this.txt1_sendinfo.Focus();}//接收?qǐng)D片信息privatevoidViewImg(Streams)//將異步接收到的信息顯示在富文本框里{richTextBox1.SelectionStart=richTextBox1.Text.Length;richTextBox1.SelectionColor=Color.LightCoral;richTextBox1.AppendText("服務(wù)器接收?qǐng)D片<-"+DateTime.Now.ToLongTimeString()+"->:\r\n");Clipboard.SetDataObject(Image.FromStream(s));//利用剪切板richTextBox1.Paste();richTextBox1.SelectionColor=Color.LightCoral;richTextBox1.AppendText("\n");richTextBox1.SelectionStart=richTextBox1.Text.Length;richTextBox1.Focus();txt1_sendinfo.Focus();}//上傳圖片文件中的圖片privatevoidbtnImgFile_Click(objectsender,EventArgse){openfiledialog.Filter="所有文件(*.*)|*.*|位圖文(*.bmp)|*.bmp|文件(*.jpg)|*.jpg|文件(*.gif)|*.gif";if(openfiledialog.ShowDialog()==DialogResult.OK){Stringstrpath=openfiledialog.FileName;fstream=newFileStream(strpath,FileMode.Open);BinaryReaderbreader=newBinaryReader(fstream);img=breader.ReadBytes((int)fstream.Length);Clipboard.SetDataObject(Image.FromStream(fstream));txt1_sendinfo.Paste();imgflag=1;}}//退出聊天室privatevoidbtn_Exit_Click(objectsender,EventArgse){if(btn_stop.Enabled!=true){this.Close();Application.Exit();}else{MessageBox.Show("請(qǐng)先斷開(kāi)連接!");return;}}//取消發(fā)送privatevoidbtnRest_Click(objectsender,EventArgse){txt1_sendinfo.Clear();}//清屏privatevoidbtnClear_Click(objectsender,EventArgse){this.richTextBox1.Clear();}}客戶端模塊設(shè)計(jì)4.3.1客戶端登錄模塊界面客戶端進(jìn)入登錄界面(如圖4-3-1)后,輸入服務(wù)器IP地址和端口號(hào)以及自己的昵稱,點(diǎn)擊“登錄”按鈕,系統(tǒng)將驗(yàn)證輸入的服務(wù)器信息是否合法,如果合法則跳轉(zhuǎn)到聊天室,否則彈出錯(cuò)誤對(duì)話框(如圖4-3-2)。如果未輸入服務(wù)器信息則彈出提示提示(如圖4-3-3).;如果未輸入昵稱則彈出提示信息提示(如圖4-3-4);點(diǎn)擊“重置”按鈕,服務(wù)器信息和昵稱則被清空。圖4-3-1圖4-3圖4-3圖4-3-4提示輸入昵稱登錄模塊控件屬性表控件屬性值控件成員變量TextBoxtxt_IPTextBoxtxt_PortTextBoxtxtNameButton登錄btnLogButton重置btnResent客戶端登錄模塊代碼//登錄聊天室privatevoidbtnLog_Click(objectsender,EventArgse){if(txt_IP.Text==""||txt_Port.Text==""){MessageBox.Show("服務(wù)器信息不能為空!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning,MessageBoxDefaultButton.Button1);return;}if(txtName.Text==""){MessageBox.Show("請(qǐng)輸入您的呢稱!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning,MessageBoxDefaultButton.Button1);return;}else{try{IPAddressipadd=IPAddress.Parse(this.txt_IP.Text);intport=Convert.ToInt32(this.txt_Port.Text);userName=txtName.Text.ToString();tab1.Visible=false;tab2.Visible=true;this.btnImgFile.Enabled=false;this.Text=""+userName+""+DateTime.Now.ToString()+""+DateTime.Now.DayOfWeek.ToString();richTextBox1.AppendText("System:"+userName+"已進(jìn)入聊天室!<-"+DateTime.Now.ToLongTimeString()+"->\r\n");stringSerIp=txt_IP.Text.ToString();stringSerPort=txt_Port.Text.ToString();lbSerIp.Text="IP地址:"+""+SerIp+"";lbSerPort.Text="端口號(hào):"+""+SerPort;}catch(Exception){MessageBox.Show("您輸入的服務(wù)器信息不合法,\n請(qǐng)重新輸入!","錯(cuò)誤",MessageBoxButtons.OK,MessageBoxIcon.Error);}}}//重置服務(wù)器信息和昵稱privatevoidbtnResent_Click(objectsender,EventArgse){txt_IP.Clear();txt_Port.Clear();txtName.Clear();}4.3.2客戶端聊天聊天模塊界面用戶進(jìn)入聊天室后,狀態(tài)欄顯示服務(wù)器信息和昵稱。點(diǎn)擊“連接”按鈕,如果服務(wù)器已啟動(dòng),用戶連接上聊天室并與服務(wù)器進(jìn)行聊天(如圖4-3-5)另外聊天室的工具欄還有一些輔助按鈕,點(diǎn)擊“背景顏色”按鈕,設(shè)置聊天記錄的背景顏色(如圖4-3-6);點(diǎn)擊“隱藏窗口”按鈕,隱藏聊天程序;點(diǎn)擊“幫助”按鈕,彈出幫助對(duì)話框(如圖4-3-圖4-3-5客戶端聊天界面圖4-3-6設(shè)置背景顏色圖4-3-8幫助對(duì)話框聊天模塊控件屬性表控件屬性值控件成員變量Button連接(&L)btn_reqButton斷開(kāi)(&S)btn_closeButton退出(&E)btn_ExitButton背景顏色(&C)btnColoButton隱藏窗口(&Y)btnYingButton幫助(&H)btnHelpedButton關(guān)于(&A)btnAboutButton發(fā)送圖片btnImgFileButton清屏btnClearButton發(fā)送btn_sendButton取消btnRestRichTextBoxrichTextBox1RichTextBoxtxt2_sendLabelIP地址:lbSerIpLabel端口號(hào):lbSerPort聊天室模塊代碼publicpartialclassChatClient:Form{privateOpenFileDialogopenfiledialog=newOpenFileDialog();privateSaveFileDialogsavefiledialog=newSaveFileDialog();privatebyte[]img;//保存?zhèn)鲌D片時(shí)的字節(jié)數(shù)組privateintimgflag=0;privateFileStreamfstream;publicdelegatevoidUpdateMessage(stringmsg);publicdelegatevoidUpdateImg(Streams);privateSocketsocket;privateThreadthread;publicstringuserName;//與服務(wù)器連接privatevoidbtn_req_Click(objectsender,EventArgse){try{IPAddressip=IPAddress.Parse(this.txt_IP.Text);IPEndPointserver=newIPEndPoint(ip,Int32.Parse(this.txt_Port.Text));//創(chuàng)建客戶端套接字socket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);socket.Connect(server);//連接thread=newThread(newThreadStart(AcceptMessage));thread.Start();this.Text=""+userName+"Taking";richTextBox1.Clear();richTextBox1.AppendText("System:"+userName+"連接到服務(wù)器!<-"+DateTime.Now.ToLongTimeString()+"->\r\n");btn_req.Enabled=false;btn_close.Enabled=true;btnImgFile.Enabled=true;}catch{richTextBox1.Clear();richTextBox1.AppendText("System:"+userName+"未連接上服務(wù)器!<-"+DateTime.Now.ToLongTimeString()+"->\r\n");return;}}//接收后臺(tái)接收消息publicvoidAcceptMessage()//異步接收信息后臺(tái)線程方法{while(true){try{if(this.socket==null||this.socket.Connected==false){richTextBox1.Clear();richTextBox1.AppendText("System:"+userName+"未連接上服務(wù)器!<-"+DateTime.Now.ToLongTimeString()+"->\r\n");break;}NetworkStreamnetStream=newNetworkStream(this.socket);//必須放在if后,this.socket可能沒(méi)實(shí)例化//得到一條消息的長(zhǎng)度byte[]dataSize=newbyte[4];//前4字節(jié)代表后面字節(jié)總數(shù),發(fā)送時(shí)已經(jīng)處理過(guò)了netStream.Read(dataSize,0,4);intsize=System.BitConverter.ToInt32(dataSize,0);//循環(huán)接收直到一條完整的消息全部讀入到字節(jié)數(shù)組中byte[]message=newbyte[size];intdataleft=size;intstart=0;while(dataleft>0){intrecv=netStream.Read(message,start,dataleft);start+=recv;dataleft-=recv;}if(message[0]==101)//101代表傳輸圖片{MemoryStreamms=newMemoryStream(message,1,message.Length-1);richTextBox1.BeginInvoke(newUpdateImg(ViewImg),newobject[]{ms});}else//默認(rèn)進(jìn)行普通傳輸{stringMsg=System.Text.Encoding.Unicode.GetString(message,1,message.Length-1);richTextBox1.BeginInvoke(newUpdateMessage(ViewMessage),newobject[]{Msg});}Thread.Sleep(100);}catch(System.Net.Sockets.SocketExceptionex){MessageBox.Show(userName+":"+ex.Message);}}}//傳輸文件privatevoidViewMessage(stringmsg){richTextBox1.SelectionColor=Color.SteelBlue;richTextBox1.AppendText(msg+"\n");richTextBox1.SelectionStart=richTextBox1.Text.Length;//定位到最后,保持最新消息可見(jiàn)richTextBox1.Focus();txt2_send.Focus();}//接收?qǐng)D片信息privatevoidViewImg(Streams){richTextBox1.SelectionStart=richTextBox1.Text.Length;richTextBox1.SelectionColor=Color.SteelBlue;richTextBox1.AppendText(userName+"接收?qǐng)D片<-"+DateTime.Now.ToLongTimeString()+"->:\r\n");Clipboard.SetDataObject(Image.FromStream(s));//利用剪切板richTextBox1.Paste();richTextBox1.SelectionColor=Color.SteelBlue;richTextBox1.AppendText("\n");richTextBox1.SelectionStart=richTextBox1.Text.Length;richTextBox1.Focus();txt2_send.Focus();}//點(diǎn)擊發(fā)送按鈕privatevoidbtn_send_Click(objectsender,EventArgse){if(txt2_send.Text==""){MessageBox.Show("請(qǐng)先輸入內(nèi)容!");txt2_send.Clear();txt2_send.Focus();return;}if(imgflag==1)//imgflag的值在方法btnImgFile_Click中可能改變{//當(dāng)傳輸圖片時(shí)byte[]imgSize=newbyte[4];//將32位整數(shù)值轉(zhuǎn)換為字節(jié)數(shù)組imgSize=System.BitConverter.GetBytes(img.Length+1);//后面一個(gè)標(biāo)識(shí)數(shù):101try{NetworkStreamnetStream=newNetworkStream(this.socket);netStream.Write(imgSize,0,4);netStream.WriteByte(101);//標(biāo)識(shí)數(shù)netStream.Write(img,0,img.Length);netStream.Flush();this.richTextBox1.SelectionColor=Color.LightCoral;this.richTextBox1.AppendText(userName+"<-"+DateTime.Now.ToLongTimeString()+"->:\r\n");this.richTextBox1.SelectionStart=this.richTextBox1.Text.Length;Clipboard.SetDataObject(Image.FromStream(fstream));richTextBox1.Paste();richTextBox1.SelectionColor=Color.LightCoral;this.richTextBox1.AppendText("\n");fstream.Flush();fstream.Close();//此流必須在這里才可以消除txt2_send.Paste();this.richTextBox1.SelectionStart=this.richTextBox1.Text.Length;this.richTextBox1.Focus();this.txt2_send.Text="";this.txt2_send.Focus();imgflag=0;//復(fù)原return;//不執(zhí)行后面的傳輸文本信息}catch(System.Exceptionex){MessageBox.Show("服務(wù)器:"+ex.Message);}}//發(fā)送文本信息時(shí)this.richTextBox1.SelectionColor=Color.LightCoral;stringstr=userName+"<-"+DateTime.Now.ToLongTimeString()+"->:\r\n"+txt2_send.Text;inti=str.Length;if(i==0){return;}else{//因?yàn)閟tr為Unicode編碼,每個(gè)字符占2個(gè)字節(jié),所以實(shí)際字節(jié)數(shù)應(yīng)為字符個(gè)數(shù)*2i*=2;}byte[]dataSize=newbyte[4];//將32位整數(shù)值轉(zhuǎn)換為字節(jié)數(shù)組dataSize=System.BitConverter.GetBytes(i+1);//后面一個(gè)標(biāo)識(shí)數(shù):1byte[]sendbytes=System.Text.Encoding.Unicode.GetBytes(str);try{NetworkStreamnetStream=newNetworkStream(this.socket);netStream.Write(dataSize,0,4);netStream.WriteByte(1);//標(biāo)識(shí)數(shù)netStream.Write(sendbytes,0,sendbytes.Length);netStream.Flush();richTextBox1.SelectionColor=Color.LightCoral;this.richTextBox1.AppendText(str+"\n");

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論