IM通訊會(huì)議系統(tǒng)_第1頁(yè)
IM通訊會(huì)議系統(tǒng)_第2頁(yè)
IM通訊會(huì)議系統(tǒng)_第3頁(yè)
IM通訊會(huì)議系統(tǒng)_第4頁(yè)
IM通訊會(huì)議系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、高級(jí)編程程序設(shè)計(jì)高級(jí)編程程序設(shè)計(jì) 院 系: 計(jì)算機(jī)科學(xué)技術(shù)學(xué)院軟件工程系 班 級(jí): 軟件 08 1 班 姓 名: xxx 學(xué) 號(hào): 5 號(hào) 合 作 者: xx xxx xxx xxx 指導(dǎo)教師: xxx 2010 年 7 月 24 日 imimim 通通通通訊訊訊訊會(huì)會(huì)會(huì)會(huì)議議議議系系系系統(tǒng)統(tǒng)統(tǒng)統(tǒng) 面向?qū)ο蟪绦蛟O(shè)計(jì)任務(wù)書面向?qū)ο蟪绦蛟O(shè)計(jì)任務(wù)書 一、題目:視頻會(huì)議系統(tǒng)一、題目:視頻會(huì)議系統(tǒng) 二、設(shè)計(jì)要求二、設(shè)計(jì)要求 (1 組成課程設(shè)計(jì)小組。 (2)小組成員分工協(xié)作完成。要求每個(gè)成員有自己相對(duì)獨(dú)立的模塊,同時(shí) 要了解其他組員完成的內(nèi)容。 (3)查閱相關(guān)資料,自學(xué)具體課題中涉及到的新知識(shí)。 (4)采

2、用結(jié)構(gòu)化、模塊化程序設(shè)計(jì)方法設(shè)計(jì),功能要完善,界面美觀。 (5)所設(shè)計(jì)的系統(tǒng)應(yīng)有對(duì)數(shù)據(jù)庫(kù)操作。 (6)按要求寫出課程設(shè)計(jì)報(bào)告,并于設(shè)計(jì)結(jié)束后 1 周內(nèi)提交。其主要內(nèi)容 包括:封皮、課程設(shè)計(jì)任務(wù)書,指導(dǎo)教師評(píng)語(yǔ)與成績(jī)、目錄、概述、軟件需求 分析、總體設(shè)計(jì)、詳細(xì)設(shè)計(jì)、程序的調(diào)試與測(cè)試、總結(jié)與體會(huì)、結(jié)束語(yǔ)、程序 清單(帶中文注釋) 、參考文獻(xiàn)等。 三、課程設(shè)計(jì)工作量三、課程設(shè)計(jì)工作量 由于是設(shè)計(jì)小組團(tuán)結(jié)協(xié)作完成設(shè)計(jì)任務(wù),一般每人的程序量在 200 行有效 程序行左右,不得抄襲。 四、課程設(shè)計(jì)工作計(jì)劃四、課程設(shè)計(jì)工作計(jì)劃 2010 年 6 月 30 日前,指導(dǎo)教師講課,學(xué)生根據(jù)題目準(zhǔn)備資料,需求分析;

3、 2010 年 6 月 30 日,設(shè)計(jì)小組進(jìn)行總體方案設(shè)計(jì)和任務(wù)分工; 2010 年 7 月 1 日,提交軟件總體模塊結(jié)構(gòu)圖和分工方案; 2010 年 7 月 1 日2010 年 7 月 6 日,每人完成自己承擔(dān)的程序模塊并通過 獨(dú)立編譯; 2010 年 7 月 21 日2010 年 7 月 22 日,將各模塊集成為一個(gè)完整的系統(tǒng), 并錄入足夠的數(shù)據(jù)進(jìn)行調(diào)試運(yùn)行,數(shù)據(jù)必須存儲(chǔ)到磁盤文件中,已備驗(yàn)收; 2010 年 7 月 23 日,驗(yàn)收、開始撰寫課程設(shè)計(jì)報(bào)告; 2010 年 7 月 25 日前,提交課程設(shè)計(jì)報(bào)告,并將軟件的源文件及報(bào)告的 word 文檔打印交到老師辦公室里。 指導(dǎo)教師簽章: 教

4、研室主任簽章 高級(jí)編程課程設(shè)計(jì)指導(dǎo)教師評(píng)語(yǔ)與成績(jī) 指導(dǎo)教師評(píng)語(yǔ): 課程設(shè)計(jì)表現(xiàn)成績(jī): 課程設(shè)計(jì)驗(yàn)收成績(jī): 課程設(shè)計(jì)報(bào)告成績(jī): 課程設(shè)計(jì) 總成績(jī): 指導(dǎo)教師簽章 20010 年 7 月 日 目 錄 1 概述概述 .1 1.1 研究的背景及意義.1 1.2 設(shè)計(jì)的任務(wù)和需要的知識(shí)點(diǎn).1 1.3 具體完成的設(shè)計(jì)內(nèi)容.2 2 需求分析需求分析.3 2.1 信息需求.3 2.2 功能需求.3 3 詳細(xì)設(shè)計(jì)詳細(xì)設(shè)計(jì).4 3.1操作流程.4 3.2 部分詳細(xì)設(shè)計(jì).10 4 調(diào)試分析、測(cè)試結(jié)果調(diào)試分析、測(cè)試結(jié)果.16 5 總結(jié)總結(jié).18 6 結(jié)束語(yǔ)結(jié)束語(yǔ).20 7程序清單程序清單.22 參考文獻(xiàn)參考文獻(xiàn) .5

5、0 1 概述概述 1.1 研究的背景及意義研究的背景及意義 c#高級(jí)編程課程設(shè)計(jì)是軟件工程專業(yè)實(shí)踐性重要環(huán)節(jié)之一,是學(xué)習(xí)完 c#高級(jí)編程課程后進(jìn)行的一次較全面的綜合練習(xí)。其目的在于加深對(duì)編程 的理論、方法和基礎(chǔ)知識(shí)的理解,掌握編程實(shí)現(xiàn)機(jī)理和各種典型算法,系統(tǒng)地 了解編程的設(shè)計(jì)和實(shí)現(xiàn)思路,培養(yǎng)學(xué)生的系統(tǒng)設(shè)計(jì)能力,并了解編程的發(fā)展動(dòng) 向和趨勢(shì)。 根據(jù)老師的要求: 1、 以小組為單位,延續(xù)上學(xué)期面向?qū)ο蟪绦蛟O(shè)計(jì)課設(shè)分組形式,由李秀鵬 任項(xiàng)目經(jīng)理,臧艷協(xié)助工作。 2、 以最后一次綜合實(shí)驗(yàn) qq 程序?yàn)榛A(chǔ),進(jìn)行擴(kuò)展。要求班長(zhǎng)課代表帶領(lǐng) 同學(xué)上網(wǎng)查閱相關(guān)資料,了解目前已有網(wǎng)上會(huì)議系統(tǒng)基本情況,結(jié)合自己所

6、學(xué) 加以實(shí)現(xiàn)。 3、 課設(shè)中要充分應(yīng)用到本學(xué)期課程所學(xué)知識(shí),必須包含 internet 編程、多 線程編程、數(shù)據(jù)庫(kù)技術(shù)、win form 程序開發(fā)等相關(guān)知識(shí)。 4、 可結(jié)合已有技術(shù)、自查資料等對(duì)該系統(tǒng)進(jìn)行擴(kuò)展開發(fā),如加入視頻、語(yǔ) 音功能等。 通過自己所學(xué)到的課本知識(shí),充分運(yùn)用 socket,多線程,信道注冊(cè),網(wǎng)絡(luò) 編程,數(shù)據(jù)庫(kù)的操作等知識(shí)實(shí)現(xiàn)本組的 im 會(huì)議系統(tǒng)。 1.2 設(shè)計(jì)的任務(wù)和需要的知識(shí)點(diǎn)設(shè)計(jì)的任務(wù)和需要的知識(shí)點(diǎn) 一、設(shè)計(jì)的任務(wù)分工:一、設(shè)計(jì)的任務(wù)分工: a:負(fù)責(zé)完成大部分程序的銜接工作,包括語(yǔ)音視頻。 b:會(huì)議架構(gòu)、模式、重點(diǎn)是數(shù)據(jù)庫(kù)的管理、驗(yàn)證操作等。 c:實(shí)現(xiàn) p2p 通訊操作

7、中的各種操作。 d:實(shí)現(xiàn)傳文件功能、整個(gè)聊天室會(huì)議的建立。 e:建立服務(wù)器,構(gòu)建比較完整的服務(wù)器。 1.根據(jù)設(shè)計(jì)題目的要求,充分地分析和理解問題,明確問題要求做什么。每人 都上網(wǎng)查有關(guān) web 會(huì)議系統(tǒng)的資料。主要是能夠?qū)Υ舜握n設(shè)的進(jìn)行擴(kuò)充內(nèi)容 及要求有進(jìn)一步的了解,使功能更完善,要求是在上次綜合實(shí)驗(yàn)的基礎(chǔ)上對(duì)內(nèi) 容。 2.根據(jù)實(shí)現(xiàn)的功能,劃分出合理的模塊,明確模塊間的關(guān)系。 3.編程實(shí)現(xiàn)所設(shè)計(jì)的程序。 4.程序調(diào)試與測(cè)試。 5.結(jié)果分析。程序運(yùn)行結(jié)果包括正確的輸入及其輸出結(jié)果和含有錯(cuò)誤的輸入及 其輸出結(jié)果。 6.編寫課程設(shè)計(jì)報(bào)告; 二、所需要的知識(shí):二、所需要的知識(shí): 通過自己所學(xué)到的課本知

8、識(shí),充分運(yùn)用 socket,多線程,信道注冊(cè),網(wǎng)絡(luò) 編程,數(shù)據(jù)庫(kù)的操作等知識(shí)實(shí)現(xiàn)本組的 im 會(huì)議系統(tǒng)。 1.3 具體完成的設(shè)計(jì)內(nèi)容具體完成的設(shè)計(jì)內(nèi)容 由于人員分工問題,我們組 5 個(gè)人各有不同分工,但是都是在一起討論研 究,怎樣去實(shí)現(xiàn),怎樣實(shí)現(xiàn)是最好最簡(jiǎn)單,最快速的。 設(shè)計(jì)的主要內(nèi)容涵蓋: 1、登錄服務(wù)器-數(shù)據(jù)庫(kù)驗(yàn)證-返回 :正確-進(jìn)入主窗體 錯(cuò)誤: 重新登錄 2、主窗體里的 form_load 開啟監(jiān)聽,接收用戶列表、上線、下線、會(huì)議 創(chuàng)建。 3、創(chuàng)建會(huì)議成功傳入服務(wù)器-保存到數(shù)據(jù)庫(kù)-參加會(huì)議-登 錄驗(yàn)證-服務(wù)器 4、驗(yàn)證- 數(shù)據(jù)庫(kù)驗(yàn)證-返回。 5、聊天-悄悄話-群聊廣播-保存-消息據(jù)路漫

9、游。 6、消息記錄-調(diào)用-反饋服務(wù)器-數(shù)據(jù)庫(kù)反饋-窗體顯示。 7、主窗體雙擊單聊-主要是開啟不同的端口號(hào),協(xié)調(diào)好不同單聊個(gè)數(shù)的 端口。 8、發(fā)送文件-同步異步、現(xiàn)實(shí)進(jìn)度條。 9 、視頻控制、多人視頻群發(fā),接受視頻和發(fā)送視頻。 10、 語(yǔ)音聊天-實(shí)現(xiàn)從錄音中 把 緩存字節(jié)發(fā)送到客戶端 并成功接析。 而我在這里面討論中主要負(fù)責(zé)語(yǔ)音、視頻的開發(fā)研究工作,對(duì)大家的連接 要求做好規(guī)定。 2 需求分析需求分析 2.1 信息需求信息需求 這個(gè) im 會(huì)議系統(tǒng)信息需求要 5 個(gè)步驟: (1)安裝軟件客戶端安裝,服務(wù)器斷開器。 (2) 運(yùn)行,注冊(cè)或登錄,填寫驗(yàn)證信息進(jìn)行數(shù)據(jù)庫(kù)驗(yàn)證。 (3)正在登錄窗體,聯(lián)系到服

10、務(wù)器并有服務(wù)器驗(yàn)證,正確的話進(jìn)入主窗體。 (4) 在主窗體中可以p2p聊天各種操作,然后可以建立會(huì)議室,參加會(huì)議 (5)在會(huì)議中進(jìn)行視頻、傳文件、查看消息記錄的功能。 2.2 功能需求功能需求 整個(gè) im 會(huì)議系統(tǒng)分為服務(wù)器需求、和客戶端功能需求: 首先是服務(wù)器: (1)服務(wù)器需要監(jiān)聽并時(shí)刻把所要連接的客戶端加進(jìn)來(lái),并更新所有客戶 端的在線列表、會(huì)議列表。 (2)服務(wù)器要執(zhí)行數(shù)據(jù)庫(kù)的操作:根據(jù)驗(yàn)證信息進(jìn)行數(shù)據(jù)庫(kù)驗(yàn)證、顯示所有 注冊(cè)人員信息、保存會(huì)議信息、保存會(huì)議記錄、查看會(huì)議記錄等功能。 其次是客戶端: (1)客戶端要建立起有好的界面關(guān)系,使用戶一接觸便能使用的功能。 (2)登錄窗體要做好是登

11、錄以及在登錄途中退出的各種信息設(shè)置、添加各 種調(diào)制信息,以免 bug 的出現(xiàn)。 (3)主窗體要實(shí)現(xiàn)和 qq 同樣的雙機(jī)私聊功能,設(shè)置在線人員列表圖片, 并添加修改個(gè)人信息的功能。 (4)增加來(lái)電提示、上線提示、消息提示等提示功能。 (5)會(huì)議創(chuàng)建參加要有密碼進(jìn)入,一個(gè)用戶只能同步參加一個(gè)會(huì)議,其他 的必須排隊(duì)等待, (6)在會(huì)議中要顯示創(chuàng)建人員,參加人員,會(huì)議內(nèi)容,并對(duì)消息記錄進(jìn)行 保存。 (7)在會(huì)議中添加傳送文件,發(fā)送視頻功能,參加人員可以傳文件,但是 只能接受視頻,不能開啟視頻。 3 詳細(xì)設(shè)計(jì)詳細(xì)設(shè)計(jì) 3.1 操作流程 (1) 首先是服務(wù)器的啟動(dòng):如圖所示, 圖 1 服務(wù)器顯示。 (2)

12、客戶端登錄界面,如圖所示, 圖 2 客戶端登陸界面 (3)系統(tǒng)登錄驗(yàn)證界面,如圖演示, 圖 3 系統(tǒng)登錄界面 (4)登陸后的主窗體顯示, 圖 4 登陸后的主窗體 圖 5 私聊窗體顯示 (6)會(huì)議室的建立,如圖顯示, 圖 6 創(chuàng)建會(huì)議窗體 圖 7 會(huì)議列表顯示窗體 以及參加會(huì)議輸入密碼提示窗體, 圖 8 參加會(huì)議人員進(jìn)入會(huì)議窗體 (7)整個(gè)會(huì)議室主窗體的顯示, 圖 9 會(huì)議室窗體 (8)消息記錄顯示按鈕功能, 圖 10 顯示消息記錄功能 (9)傳送文件顯示功能 圖 11 創(chuàng)建人發(fā)送文件給參加人員 (10)視頻聊天顯示功能 圖 12 視頻會(huì)議圖片 3.2 部分詳細(xì)設(shè)計(jì) 1、發(fā)送文件部分: 發(fā)送文件

13、的操作其實(shí)還可以在擴(kuò)加功能,共享文件,對(duì)參加會(huì)議的人員進(jìn) 行內(nèi)容共享。 其方法就是把文件傳至服務(wù)器,保存到服務(wù)器硬盤中,參加會(huì)議人員可以 下載,其形式和查看消息記錄差不多。 在發(fā)送文件的時(shí)候,先是把 文件的名字,文件的大小傳至接收人員客戶 端,等接收人員客戶端解析以后,開始傳送,在傳送的時(shí)候,用 begininvoke()方法進(jìn)行異步界面更新發(fā)送進(jìn)度。 接收方法和發(fā)送的差不多主要是先開始監(jiān)聽,代碼就不說了。 主要代碼如下: private void 發(fā)送文件toolstripmenuitem1_click(object sender, eventargs e) if (listbox1.sel

14、ecteditem = null) messagebox.show(請(qǐng)先選擇指定對(duì)象!,提示); return; b = new thread(new threadstart(this.send); b.isbackground = true; b.start(); this.donghua(); private void send()/發(fā)送文件的方法 string host = listbox1.selecteditem.tostring(); string hostip = null; for (int i = 0; i list_user.count; i+) perinfo p = (

15、perinfo)list_useri; if (host = ) hostip = p.ip; break; try tcpclient client = new tcpclient(hostip, 16); networkstream ns = client.getstream(); openfiledialog aa = new openfiledialog(); if (aa.showdialog() = dialogresult.ok) string ss = aa.filename.split(); string filename = ssss.length - 1; f

16、ilestream fs = new filestream(aa.filename, filemode.open, fileaccess.read); binaryreader br = new binaryreader(fs); int64 size = fs.length; byte bytes = new byte1024 * 1024; bytes = encoding.unicode.getbytes(file| + size.tostring() + | + filename + |); ns.write(bytes, 0, bytes.length); int64 total =

17、 0; while (total size) int x = br.read(bytes, 0, bytes.length); ns.write(bytes, 0, x); total += x; /this.invoke(new methodinvoker(delegate() / progressbar1.value = convert.toint32(100*(1.0*total/size); / if(progressbar1.value = 100) / timer1.enabled = false; /); gengxin me = new gengxin(this.myinvok

18、e); begininvoke(me, convert.toint32(100.0 * total / size); timer1.enabled = false; messagebox.show(發(fā)送完畢); catch private void donghua() point p = new point(255, 124); groupbox1.location = p; size s = new size(118, 192); groupbox1.size = s; this.panel1.visible = true; timer1.enabled = true; time = 0;

19、private void myinvoke(int x)/異步進(jìn)行更新操作 progressbar1.value = x; 2、視頻部分: 視頻會(huì)議主要是,創(chuàng)建會(huì)議人員發(fā)送視頻,其他人接收視頻,只能看到創(chuàng) 建人員視頻 開始調(diào)用引入系統(tǒng)函數(shù)獲取接收開啟視頻的指令,等 time1 好使就開始發(fā) 送視頻,并且自己接受自己視頻。主要代碼: private void start_receiving_video_conference()/接收視頻信號(hào) try / open the port mytcpl = new tcplistener(8000); mytcpl.start(); / start li

20、stening on that port mysocket = mytcpl.acceptsocket(); / accept any request from client and start a session ns = new networkstream(mysocket); / receives the binary data from port picturebox1.image = image.fromstream(ns); mytcpl.stop(); / close tcp session if (mysocket.connected = true) / looping whi

21、le connected to receive another message while (true) start_receiving_video_conference(); / back to first method myns.flush(); catch (exception) private void start_sending_video_conference(string remote_ip, int port_number)/通過知道對(duì)方的ip和端口號(hào),給對(duì)方發(fā)送視頻 try ms = new memorystream();/ store it in binary array

22、as stream picturebox1.image.save(ms, system.drawing.imaging.imageformat.jpeg); byte arrimage = ms.getbuffer(); myclient = new tcpclient(remote_ip, port_number);/connecting with server myns = myclient.getstream(); mysw = new binarywriter(myns); mysw.write(arrimage);/send the stream to above address m

23、s.flush(); mysw.flush(); myns.flush(); ms.close(); mysw.close(); myns.close(); myclient.close(); catch (exception ex) capturing.enabled = false; messagebox.show(ex.message, video conference error message, messageboxbuttons.ok, messageboxicon.error); private void webcamcapture_imagecaptured(object so

24、urce, webcam_capture.webcameventargs e) this.picturebox1.image = e.webcamimage; private void 結(jié)束視頻toolstripmenuitem_click(object sender, eventargs e) this.webcamcapture.stop(); capturing.enabled = false; size p = new size(427, 433); this.size = p; string mes = vedioend|; byte bytes = encoding.unicode

25、.getbytes(mes); for (int i = 0; i list_user.count; i+) perinfo sa = (perinfo)list_useri; if ( != login.user_name) tcpclient client = new tcpclient(sa.ip, 16); networkstream ns = client.getstream(); ns.write(bytes, 0, bytes.length); client.close(); 4 調(diào)試分析、測(cè)試結(jié)果調(diào)試分析、測(cè)試結(jié)果 1、在用戶登錄后由于異常造成的二次登陸后,在主窗

26、體上顯示自己名字 2 遍,創(chuàng)建的會(huì)議也會(huì)同時(shí)顯示 2 遍的 bug。 如圖所示, 圖 13 登錄異常顯示圖 調(diào)試結(jié)果,在服務(wù)器里增加判斷,如果人員下線或異常下線的話,刪除在 線用戶列表中的該用戶信息,會(huì)議保留。 調(diào)試結(jié)果運(yùn)行正確。 2、在視頻發(fā)送文件會(huì)議室里,開視頻查看會(huì)議記錄的時(shí)候,就會(huì)把視頻給 擋上,使視頻給覆蓋,只有關(guān)閉消息記錄才可以顯示視頻內(nèi)容, 在發(fā)送文件的時(shí)候,沒有屏蔽掉給自己傳的功能,不能給自己傳,錯(cuò)誤結(jié) 果如圖所示, 圖 14 給自己傳送文件的錯(cuò)誤 代碼修改后,在自己那塊加了個(gè)遍歷屏蔽。就不能給自己傳文件了。 5 總結(jié)總結(jié) 本次課程設(shè)計(jì)讓我明白了一個(gè)人的力量的弱小和不足,通過這

27、次課程設(shè)計(jì), 我發(fā)現(xiàn)自己對(duì)知識(shí)掌握還存在著很多的不足之處,同時(shí)我也明白了自己還有哪 些地方需要改進(jìn),自己要在哪些地方進(jìn)行自我的提升。尤為重要的是,這次課 程設(shè)計(jì)使我們懂得了理論與實(shí)際相結(jié)合是很重要的。 在這次課程設(shè)計(jì)中,我雖然遇到一些困難,但我仍能堅(jiān)持克服。通過這個(gè)小 小的課題,我們也學(xué)到了一些課外的東西,多謝學(xué)校給了我們一次體驗(yàn)的機(jī)會(huì), 謝謝老師在我困難的時(shí)候給我們的指導(dǎo),也謝謝在這段時(shí)間給過我們幫助的同 學(xué),在把核心代碼通過可視化界面實(shí)現(xiàn),需要建立許多接口函數(shù),由輸入接口 接受數(shù)據(jù),需要入口函數(shù)。把核心代碼運(yùn)算的結(jié)果輸出到界面,需要輸口函數(shù)。 而且體會(huì)到可視化程序設(shè)計(jì),能更好的理解程序的運(yùn)

28、行機(jī)制,有助于更好的設(shè) 計(jì)程序。加深對(duì)該課程的理解,在這次設(shè)計(jì)過程中使我對(duì) c#的開發(fā)建立了濃厚 的興趣。以后我會(huì)好好努力的! 通過這次的課程設(shè)計(jì),使我了解了一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)視頻會(huì)議系統(tǒng)的設(shè)計(jì)過程,并且更 進(jìn)一步掌握了 sql server 2005 的基本用法,和 visual studio 2005 的基本用法;掌握c#高 級(jí)編程技術(shù)課程的基本知識(shí)及其應(yīng)用情況,對(duì)數(shù)據(jù)庫(kù)的運(yùn)用操作;學(xué)會(huì)了采用結(jié)構(gòu)化、模 塊化程序設(shè)計(jì)方法進(jìn)行程序設(shè)計(jì),在這次設(shè)計(jì)過程中使我對(duì)高級(jí)編程和數(shù)據(jù)庫(kù)的開發(fā)建立了 濃厚的興趣,并且了解到一個(gè)項(xiàng)目軟件是怎樣產(chǎn)生的,以及制作的流水過程。 本系統(tǒng)基本完成了一個(gè)視頻會(huì)議系統(tǒng)所需求的

29、功能如文件傳輸、視頻傳輸、文字傳輸、 文件保存等但由于本人技術(shù)有限,導(dǎo)致主界面不夠簡(jiǎn)潔。先前設(shè)計(jì)的代碼很復(fù)雜,最后進(jìn) 行了精簡(jiǎn)修改,使得代碼基本符合規(guī)范化設(shè)計(jì)。其中視圖間通信的方式,都是采用刷新的 辦法,因此有閃爍的現(xiàn)象。 由于本人的經(jīng)驗(yàn)有限,設(shè)計(jì)方法經(jīng)驗(yàn)欠缺,導(dǎo)致軟件的不成熟,是軟件開發(fā)的一大遺 憾。從此次設(shè)計(jì)編碼,足見我需要更加努力。我會(huì)在未來(lái)延續(xù)這種思維,開拓自己的設(shè)計(jì) 開發(fā)思想。 6 結(jié)束語(yǔ)結(jié)束語(yǔ) 經(jīng)過這次課程設(shè)計(jì),我學(xué)到了很多只是,也重新將以前學(xué)過的知識(shí)復(fù)習(xí)一 遍,對(duì) c#的知識(shí)也有了更一步的提高,受益頗深。在這次過程中,遇到許多意 想不到的問題,在老師和同學(xué)的幫助下得到了解決,謝謝

30、大家的幫助。我會(huì)找 出我的不足,通過努力學(xué)習(xí)把它填不上。我由衷的感謝大家。感謝老師的教導(dǎo), 謝謝老師的努力。 7程序清單程序清單 namespace im會(huì)議客戶端/login登錄代碼 public partial class login : form public login() initializecomponent(); public static string server; public static string user_name; public static string user_psw; private void button1_click(object sender, e

31、ventargs e) if (textbox2.text = | textbox3.text = ) messagebox.show(用戶名或密碼不能為空!,提示 ,messageboxbuttons.ok,messageboxicon.exclamation); textbox2.focus(); return; server = textbox1.text.trim(); user_name = textbox2.text.trim(); user_psw = textbox3.text.trim(); this.dialogresult = dialogresult.ok; priva

32、te void button2_click(object sender, eventargs e) this.dialogresult = dialogresult.cancel; application.exit(); private void textbox3_keydown(object sender, keyeventargs e) if (e.keyvalue = 13) button1_click(this,null); private void linklabel2_linkclicked(object sender, linklabellinkclickedeventargs

33、e) register r = new register(); r.show(); namespace im會(huì)議客戶端 /正在登錄代碼 public partial class im_loading : form public im_loading() control.checkforillegalcrossthreadcalls = false; initializecomponent(); private socket sock,socket,clientsock; dialogresult dr; private thread a; private login f; private vo

34、id loading_load(object sender, eventargs e) re_login(); private void re_login() f = new login(); dr = f.showdialog(); f.close(); a = new thread(new threadstart(this.user_login); a.isbackground = true; a.start(); private void user_login() this.visible = true; sock = new socket(addressfamily.internetw

35、ork, sockettype.stream, protocoltype.tcp); sock.blocking = true; try ipendpoint ep = new ipendpoint(ipaddress.parse(login.server),14); sock.connect(ep); catch messagebox.show(網(wǎng)絡(luò)連接失敗,請(qǐng)查看網(wǎng)絡(luò)連接!, 提示, messageboxbuttons.ok, messageboxicon.information); this.visible = false; re_login(); string login_info =

36、 join| + login.user_name + | + login.user_psw + |; byte recs = encoding.unicode.getbytes(login_info); sock.send(recs); networkstream ns = new networkstream(sock); int bt = ns.readbyte(); if (bt = 0) messagebox.show(用戶名或密碼錯(cuò)誤!, 提示, messageboxbuttons.ok, messageboxicon.exclamation); this.visible = fals

37、e; re_login(); else sock.close(); this.visible = false; this.invoke(new methodinvoker(delegate() mainform mf = new mainform(); mf.show(); ); private void button1_click(object sender, eventargs e) this.hide(); re_login(); namespace im會(huì)議客戶端 /主窗體代碼 public partial class mainform : form public mainform()

38、 checkforillegalcrossthreadcalls = false; initializecomponent(); private socket sock, clientsock; private thread a; private struct perinfo public string ip, name; public perinfo(string ip, string _name) this.ip = ip; = _name; ; public static arraylist list = new arraylist(); public static

39、int port = 17; public static arraylist meeting_list = new arraylist(); private delegate void myinvoke(string s); private delegate void myinvoke(string s); private void mainform_load(object sender, eventargs e) a = new thread(new threadstart(this.start); a.isbackground = true; a.start(); private void

40、 start() iphostentry ip = dns.gethostbyname(dns.gethostname(); ipendpoint ep = new ipendpoint(ip.addresslist0, 15); sock = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp); sock.blocking = true; sock.bind(ep); sock.listen(-1); while (true) try clientsock = sock.accept(); i

41、f (clientsock.connected) thread c = new thread(new threadstart(this.receive); c.isbackground = true; c.start(); catch private void list_add(string s) int count = this.listview2.items.count; listview2.items.insert(count, new listviewitem(new string s); listview2.itemscount.imageindex = count % 4; pri

42、vate void user_on(string s) soundplayer sound = new soundplayer(global.wav); sound.play(); this.panel1.visible = true; point p = new point(49,365); this.panel1.location = p; label1.text = ; label1.text += s + 上線了; system.threading.thread.sleep(5000); this.panel1.visible = false; private void receive

43、() socket s = clientsock; byte recs = new byte32767; try s.receive(recs); catch string mes = encoding.unicode.getstring(recs).split(|); if (mes0 = join) myinvoke me = new myinvoke(this.user_on); begininvoke(me,mes1); else if (mes0 = list) list.clear(); for (int i = 1; i mes.length-1; i+) string toke

44、n = mesi.split(:); perinfo p = new perinfo(token0,token1); list.add(p); this.invoke(new methodinvoker(delegate() listview2.items.clear(); ); for (int i = 1; i mes.length-1; i+) string token = mesi.split(:); myinvoke me = new myinvoke(this.list_add); begininvoke(me, token0); else if (mes0 = priv) thi

45、s.invoke(new methodinvoker(delegate() per_receive pr = new per_receive(mes1,mes2,convert.toint32(mes3); pr.show(); ); else if (mes0 = meeting) meeting_info mf = new meeting_info(mes1, mes2, mes3); meeting_list.add(mf); this.invoke(new methodinvoker(delegate() listview1.items.add(new listviewitem(new

46、 string mes1, mes2 ); ); private void notifyicon1_mousedoubleclick(object sender, mouseeventargs e) if (this.windowstate = formwindowstate.minimized) this.windowstate = formwindowstate.normal; else this.windowstate = formwindowstate.minimized; private void 建立會(huì)議室toolstripmenuitem_click(object sender,

47、 eventargs e) createmeeting cm = new createmeeting(); cm.show(); private void 退出toolstripmenuitem_click(object sender, eventargs e) application.exit(); private void listview1_mousedoubleclick(object sender, mouseeventargs e) string user = listview1.selecteditems0.subitems0.text.tostring(); if (user

48、!= login.user_name) join j = new join(user); j.show(); else meetingform mf = new meetingform(login.user_name); mf.show(); private void 關(guān)于我們toolstripmenuitem_click(object sender, eventargs e) help p = new help(); p.show(); private void listview2_mousedoubleclick(object sender, mouseeventargs e) strin

49、g name = listview2.selecteditems0.text.tostring().trim(); if (name = login.user_name) messagebox.show(不能跟自己聊!,提示 ,messageboxbuttons.ok,messageboxicon.hand); return; string ip = null; for (int i = 0; i list.count; i+) perinfo p = (perinfo)listi; if (name = p.ip) ip = ; break; iphostentry host =

50、 dns.gethostbyname(dns.gethostname(); string mes = priv| + login.user_name + | + host.addresslist0.tostring()+|+port.tostring()+|; byte bytes = encoding.unicode.getbytes(mes); try tcpclient client = new tcpclient(ip.trim(), 15); networkstream ns = client.getstream(); ns.write(bytes, 0, bytes.length)

51、; client.close(); ns.close(); catch per_send ps = new per_send(name,ip,port); port+; ps.show(); namespace im會(huì)議客戶端 /私聊窗體代碼 public partial class per_receive : form public per_receive() initializecomponent(); public per_receive(string name,string ip,int port) initializecomponent(); = name; th

52、is.ip = ip; this.port = port; private string name,ip; private int port; private socket sock, clientsock; private thread a; private void start() iphostentry ip = dns.gethostbyname(dns.gethostname(); ipendpoint ep = new ipendpoint(ip.addresslist0, port); sock = new socket(addressfamily.internetwork, s

53、ockettype.stream, protocoltype.tcp); sock.blocking = true; sock.bind(ep); sock.listen(-1); while (true) clientsock = sock.accept(); if (clientsock.connected) thread c = new thread(new threadstart(this.receive); c.isbackground = true; c.start(); private void receive() socket s = clientsock; byte recs

54、 = new byte32767; s.receive(recs); string mes = encoding.unicode.getstring(recs).split(|); if (mes0 = chat) soundplayer sound = new soundplayer(msg.wav); sound.play(); richtextbox1.appendtext(mes1 + n); else if (mes0 = dong) this.invoke(new methodinvoker(delegate() donghua(); ); private void donghua

55、() point p = this.location; for (int i = 0; i 30; i+) this.left += 2; this.width += 2; thread.sleep(10); this.left -= 2; this.width -= 2; this.location = p; private void button1_click_1(object sender, eventargs e) string mes = chat| + login.user_name + 說: + textbox1.text.tostring() + |; byte bytes =

56、 encoding.unicode.getbytes(mes); tcpclient client = new tcpclient(ip, port); networkstream ns = client.getstream(); ns.write(bytes, 0, bytes.length); client.close(); ns.close(); richtextbox1.appendtext(login.user_name + 說: + textbox1.text.tostring()+n); textbox1.clear(); textbox1.focus(); private vo

57、id per_receive_load(object sender, eventargs e) this.text = 正在與 + name + 交談中.; a = new thread(new threadstart(this.start); a.isbackground = true; a.start(); private void button2_click(object sender, eventargs e) a.abort(); this.close(); private void button3_click(object sender, eventargs e) string m

58、es = dong|; byte bytes = encoding.unicode.getbytes(mes); tcpclient client = new tcpclient(ip, port); networkstream ns = client.getstream(); ns.write(bytes, 0, bytes.length); client.close(); ns.close(); namespace im會(huì)議客戶端 /會(huì)議窗體代碼 public partial class meetingform : form public meetingform() initializec

59、omponent(); public meetingform(string user) initializecomponent(); label4.text = user; private int time = 0; private socket sock, clientsock; private struct perinfo public string ip, name; public perinfo(string _name,string ip ) this.ip = ip; = _name; ; private arraylist list_user = new ar

60、raylist(); private thread myth; private socket r; private fifostream m_fifo = new fifostream(); private waveoutplayer m_player; private waveinrecorder m_recorder; private thread t,a,b; private bool connected = false; private byte m_playbuffer; private byte m_recbuffer; memorystream ms; binarywriter

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論