




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、高級編程程序設計高級編程程序設計 院 系: 計算機科學技術學院軟件工程系 班 級: 軟件 08 1 班 姓 名: xxx 學 號: 5 號 合 作 者: xx xxx xxx xxx 指導教師: xxx 2010 年 7 月 24 日 imimim 通訊會議系統(tǒng)通訊會議系統(tǒng)通訊會議系統(tǒng)通訊會議系統(tǒng) 面向?qū)ο蟪绦蛟O計任務書面向?qū)ο蟪绦蛟O計任務書 一、題目:視頻會議系統(tǒng)一、題目:視頻會議系統(tǒng) 二、設計要求二、設計要求 (1 組成課程設計小組。 (2)小組成員分工協(xié)作完成。要求每個成員有自己相對獨立的模塊,同時 要了解其他組員完成的內(nèi)容。 (3)查閱相關資料,自學具體課題中涉及到的新知識。 (4)采
2、用結構化、模塊化程序設計方法設計,功能要完善,界面美觀。 (5)所設計的系統(tǒng)應有對數(shù)據(jù)庫操作。 (6)按要求寫出課程設計報告,并于設計結束后 1 周內(nèi)提交。其主要內(nèi)容 包括:封皮、課程設計任務書,指導教師評語與成績、目錄、概述、軟件需求 分析、總體設計、詳細設計、程序的調(diào)試與測試、總結與體會、結束語、程序 清單(帶中文注釋) 、參考文獻等。 三、課程設計工作量三、課程設計工作量 由于是設計小組團結協(xié)作完成設計任務,一般每人的程序量在 200 行有效 程序行左右,不得抄襲。 四、課程設計工作計劃四、課程設計工作計劃 2010 年 6 月 30 日前,指導教師講課,學生根據(jù)題目準備資料,需求分析;
3、 2010 年 6 月 30 日,設計小組進行總體方案設計和任務分工; 2010 年 7 月 1 日,提交軟件總體模塊結構圖和分工方案; 2010 年 7 月 1 日2010 年 7 月 6 日,每人完成自己承擔的程序模塊并通過 獨立編譯; 2010 年 7 月 21 日2010 年 7 月 22 日,將各模塊集成為一個完整的系統(tǒng), 并錄入足夠的數(shù)據(jù)進行調(diào)試運行,數(shù)據(jù)必須存儲到磁盤文件中,已備驗收; 2010 年 7 月 23 日,驗收、開始撰寫課程設計報告; 2010 年 7 月 25 日前,提交課程設計報告,并將軟件的源文件及報告的 word 文檔打印交到老師辦公室里。 指導教師簽章: 教
4、研室主任簽章 高級編程課程設計指導教師評語與成績 指導教師評語: 課程設計表現(xiàn)成績: 課程設計驗收成績: 課程設計報告成績: 課程設計 總成績: 指導教師簽章 20010 年 7 月 日 目 錄 1 概述概述 .1 1.1 研究的背景及意義.1 1.2 設計的任務和需要的知識點.1 1.3 具體完成的設計內(nèi)容.2 2 需求分析需求分析.3 2.1 信息需求.3 2.2 功能需求.3 3 詳細設計詳細設計.4 3.1操作流程.4 3.2 部分詳細設計.10 4 調(diào)試分析、測試結果調(diào)試分析、測試結果.16 5 總結總結.18 6 結束語結束語.20 7程序清單程序清單.22 參考文獻參考文獻 .5
5、0 1 概述概述 1.1 研究的背景及意義研究的背景及意義 c#高級編程課程設計是軟件工程專業(yè)實踐性重要環(huán)節(jié)之一,是學習完 c#高級編程課程后進行的一次較全面的綜合練習。其目的在于加深對編程 的理論、方法和基礎知識的理解,掌握編程實現(xiàn)機理和各種典型算法,系統(tǒng)地 了解編程的設計和實現(xiàn)思路,培養(yǎng)學生的系統(tǒng)設計能力,并了解編程的發(fā)展動 向和趨勢。 根據(jù)老師的要求: 1、 以小組為單位,延續(xù)上學期面向?qū)ο蟪绦蛟O計課設分組形式,由李秀鵬 任項目經(jīng)理,臧艷協(xié)助工作。 2、 以最后一次綜合實驗 qq 程序為基礎,進行擴展。要求班長課代表帶領 同學上網(wǎng)查閱相關資料,了解目前已有網(wǎng)上會議系統(tǒng)基本情況,結合自己所
6、學 加以實現(xiàn)。 3、 課設中要充分應用到本學期課程所學知識,必須包含 internet 編程、多 線程編程、數(shù)據(jù)庫技術、win form 程序開發(fā)等相關知識。 4、 可結合已有技術、自查資料等對該系統(tǒng)進行擴展開發(fā),如加入視頻、語 音功能等。 通過自己所學到的課本知識,充分運用 socket,多線程,信道注冊,網(wǎng)絡 編程,數(shù)據(jù)庫的操作等知識實現(xiàn)本組的 im 會議系統(tǒng)。 1.2 設計的任務和需要的知識點設計的任務和需要的知識點 一、設計的任務分工:一、設計的任務分工: a:負責完成大部分程序的銜接工作,包括語音視頻。 b:會議架構、模式、重點是數(shù)據(jù)庫的管理、驗證操作等。 c:實現(xiàn) p2p 通訊操作
7、中的各種操作。 d:實現(xiàn)傳文件功能、整個聊天室會議的建立。 e:建立服務器,構建比較完整的服務器。 1.根據(jù)設計題目的要求,充分地分析和理解問題,明確問題要求做什么。每人 都上網(wǎng)查有關 web 會議系統(tǒng)的資料。主要是能夠?qū)Υ舜握n設的進行擴充內(nèi)容 及要求有進一步的了解,使功能更完善,要求是在上次綜合實驗的基礎上對內(nèi) 容。 2.根據(jù)實現(xiàn)的功能,劃分出合理的模塊,明確模塊間的關系。 3.編程實現(xiàn)所設計的程序。 4.程序調(diào)試與測試。 5.結果分析。程序運行結果包括正確的輸入及其輸出結果和含有錯誤的輸入及 其輸出結果。 6.編寫課程設計報告; 二、所需要的知識:二、所需要的知識: 通過自己所學到的課本知
8、識,充分運用 socket,多線程,信道注冊,網(wǎng)絡 編程,數(shù)據(jù)庫的操作等知識實現(xiàn)本組的 im 會議系統(tǒng)。 1.3 具體完成的設計內(nèi)容具體完成的設計內(nèi)容 由于人員分工問題,我們組 5 個人各有不同分工,但是都是在一起討論研 究,怎樣去實現(xiàn),怎樣實現(xiàn)是最好最簡單,最快速的。 設計的主要內(nèi)容涵蓋: 1、登錄服務器-數(shù)據(jù)庫驗證-返回 :正確-進入主窗體 錯誤: 重新登錄 2、主窗體里的 form_load 開啟監(jiān)聽,接收用戶列表、上線、下線、會議 創(chuàng)建。 3、創(chuàng)建會議成功傳入服務器-保存到數(shù)據(jù)庫-參加會議-登 錄驗證-服務器 4、驗證- 數(shù)據(jù)庫驗證-返回。 5、聊天-悄悄話-群聊廣播-保存-消息據(jù)路漫
9、游。 6、消息記錄-調(diào)用-反饋服務器-數(shù)據(jù)庫反饋-窗體顯示。 7、主窗體雙擊單聊-主要是開啟不同的端口號,協(xié)調(diào)好不同單聊個數(shù)的 端口。 8、發(fā)送文件-同步異步、現(xiàn)實進度條。 9 、視頻控制、多人視頻群發(fā),接受視頻和發(fā)送視頻。 10、 語音聊天-實現(xiàn)從錄音中 把 緩存字節(jié)發(fā)送到客戶端 并成功接析。 而我在這里面討論中主要負責語音、視頻的開發(fā)研究工作,對大家的連接 要求做好規(guī)定。 2 需求分析需求分析 2.1 信息需求信息需求 這個 im 會議系統(tǒng)信息需求要 5 個步驟: (1)安裝軟件客戶端安裝,服務器斷開器。 (2) 運行,注冊或登錄,填寫驗證信息進行數(shù)據(jù)庫驗證。 (3)正在登錄窗體,聯(lián)系到服
10、務器并有服務器驗證,正確的話進入主窗體。 (4) 在主窗體中可以p2p聊天各種操作,然后可以建立會議室,參加會議 (5)在會議中進行視頻、傳文件、查看消息記錄的功能。 2.2 功能需求功能需求 整個 im 會議系統(tǒng)分為服務器需求、和客戶端功能需求: 首先是服務器: (1)服務器需要監(jiān)聽并時刻把所要連接的客戶端加進來,并更新所有客戶 端的在線列表、會議列表。 (2)服務器要執(zhí)行數(shù)據(jù)庫的操作:根據(jù)驗證信息進行數(shù)據(jù)庫驗證、顯示所有 注冊人員信息、保存會議信息、保存會議記錄、查看會議記錄等功能。 其次是客戶端: (1)客戶端要建立起有好的界面關系,使用戶一接觸便能使用的功能。 (2)登錄窗體要做好是登
11、錄以及在登錄途中退出的各種信息設置、添加各 種調(diào)制信息,以免 bug 的出現(xiàn)。 (3)主窗體要實現(xiàn)和 qq 同樣的雙機私聊功能,設置在線人員列表圖片, 并添加修改個人信息的功能。 (4)增加來電提示、上線提示、消息提示等提示功能。 (5)會議創(chuàng)建參加要有密碼進入,一個用戶只能同步參加一個會議,其他 的必須排隊等待, (6)在會議中要顯示創(chuàng)建人員,參加人員,會議內(nèi)容,并對消息記錄進行 保存。 (7)在會議中添加傳送文件,發(fā)送視頻功能,參加人員可以傳文件,但是 只能接受視頻,不能開啟視頻。 3 詳細設計詳細設計 3.1 操作流程 (1) 首先是服務器的啟動:如圖所示, 圖 1 服務器顯示。 (2)
12、客戶端登錄界面,如圖所示, 圖 2 客戶端登陸界面 (3)系統(tǒng)登錄驗證界面,如圖演示, 圖 3 系統(tǒng)登錄界面 (4)登陸后的主窗體顯示, 圖 4 登陸后的主窗體 圖 5 私聊窗體顯示 (6)會議室的建立,如圖顯示, 圖 6 創(chuàng)建會議窗體 圖 7 會議列表顯示窗體 以及參加會議輸入密碼提示窗體, 圖 8 參加會議人員進入會議窗體 (7)整個會議室主窗體的顯示, 圖 9 會議室窗體 (8)消息記錄顯示按鈕功能, 圖 10 顯示消息記錄功能 (9)傳送文件顯示功能 圖 11 創(chuàng)建人發(fā)送文件給參加人員 (10)視頻聊天顯示功能 圖 12 視頻會議圖片 3.2 部分詳細設計 1、發(fā)送文件部分: 發(fā)送文件
13、的操作其實還可以在擴加功能,共享文件,對參加會議的人員進 行內(nèi)容共享。 其方法就是把文件傳至服務器,保存到服務器硬盤中,參加會議人員可以 下載,其形式和查看消息記錄差不多。 在發(fā)送文件的時候,先是把 文件的名字,文件的大小傳至接收人員客戶 端,等接收人員客戶端解析以后,開始傳送,在傳送的時候,用 begininvoke()方法進行異步界面更新發(fā)送進度。 接收方法和發(fā)送的差不多主要是先開始監(jiān)聽,代碼就不說了。 主要代碼如下: private void 發(fā)送文件toolstripmenuitem1_click(object sender, eventargs e) if (listbox1.sel
14、ecteditem = null) messagebox.show(請先選擇指定對象!,提示); 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)/異步進行更新操作 progressbar1.value = x; 2、視頻部分: 視頻會議主要是,創(chuàng)建會議人員發(fā)送視頻,其他人接收視頻,只能看到創(chuàng) 建人員視頻 開始調(diào)用引入系統(tǒng)函數(shù)獲取接收開啟視頻的指令,等 time1 好使就開始發(fā) 送視頻,并且自己接受自己視頻。主要代碼: private void start_receiving_video_conference()/接收視頻信號 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)/通過知道對方的ip和端口號,給對方發(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 結束視頻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)試分析、測試結果調(diào)試分析、測試結果 1、在用戶登錄后由于異常造成的二次登陸后,在主窗
26、體上顯示自己名字 2 遍,創(chuàng)建的會議也會同時顯示 2 遍的 bug。 如圖所示, 圖 13 登錄異常顯示圖 調(diào)試結果,在服務器里增加判斷,如果人員下線或異常下線的話,刪除在 線用戶列表中的該用戶信息,會議保留。 調(diào)試結果運行正確。 2、在視頻發(fā)送文件會議室里,開視頻查看會議記錄的時候,就會把視頻給 擋上,使視頻給覆蓋,只有關閉消息記錄才可以顯示視頻內(nèi)容, 在發(fā)送文件的時候,沒有屏蔽掉給自己傳的功能,不能給自己傳,錯誤結 果如圖所示, 圖 14 給自己傳送文件的錯誤 代碼修改后,在自己那塊加了個遍歷屏蔽。就不能給自己傳文件了。 5 總結總結 本次課程設計讓我明白了一個人的力量的弱小和不足,通過這
27、次課程設計, 我發(fā)現(xiàn)自己對知識掌握還存在著很多的不足之處,同時我也明白了自己還有哪 些地方需要改進,自己要在哪些地方進行自我的提升。尤為重要的是,這次課 程設計使我們懂得了理論與實際相結合是很重要的。 在這次課程設計中,我雖然遇到一些困難,但我仍能堅持克服。通過這個小 小的課題,我們也學到了一些課外的東西,多謝學校給了我們一次體驗的機會, 謝謝老師在我困難的時候給我們的指導,也謝謝在這段時間給過我們幫助的同 學,在把核心代碼通過可視化界面實現(xiàn),需要建立許多接口函數(shù),由輸入接口 接受數(shù)據(jù),需要入口函數(shù)。把核心代碼運算的結果輸出到界面,需要輸口函數(shù)。 而且體會到可視化程序設計,能更好的理解程序的運
28、行機制,有助于更好的設 計程序。加深對該課程的理解,在這次設計過程中使我對 c#的開發(fā)建立了濃厚 的興趣。以后我會好好努力的! 通過這次的課程設計,使我了解了一個簡單的網(wǎng)絡視頻會議系統(tǒng)的設計過程,并且更 進一步掌握了 sql server 2005 的基本用法,和 visual studio 2005 的基本用法;掌握c#高 級編程技術課程的基本知識及其應用情況,對數(shù)據(jù)庫的運用操作;學會了采用結構化、模 塊化程序設計方法進行程序設計,在這次設計過程中使我對高級編程和數(shù)據(jù)庫的開發(fā)建立了 濃厚的興趣,并且了解到一個項目軟件是怎樣產(chǎn)生的,以及制作的流水過程。 本系統(tǒng)基本完成了一個視頻會議系統(tǒng)所需求的
29、功能如文件傳輸、視頻傳輸、文字傳輸、 文件保存等但由于本人技術有限,導致主界面不夠簡潔。先前設計的代碼很復雜,最后進 行了精簡修改,使得代碼基本符合規(guī)范化設計。其中視圖間通信的方式,都是采用刷新的 辦法,因此有閃爍的現(xiàn)象。 由于本人的經(jīng)驗有限,設計方法經(jīng)驗欠缺,導致軟件的不成熟,是軟件開發(fā)的一大遺 憾。從此次設計編碼,足見我需要更加努力。我會在未來延續(xù)這種思維,開拓自己的設計 開發(fā)思想。 6 結束語結束語 經(jīng)過這次課程設計,我學到了很多只是,也重新將以前學過的知識復習一 遍,對 c#的知識也有了更一步的提高,受益頗深。在這次過程中,遇到許多意 想不到的問題,在老師和同學的幫助下得到了解決,謝謝
30、大家的幫助。我會找 出我的不足,通過努力學習把它填不上。我由衷的感謝大家。感謝老師的教導, 謝謝老師的努力。 7程序清單程序清單 namespace im會議客戶端/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會議客戶端 /正在登錄代碼 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)絡連接失敗,請查看網(wǎng)絡連接!, 提示, 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(用戶名或密碼錯誤!, 提示, 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會議客戶端 /主窗體代碼 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 建立會議室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 關于我們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會議客戶端 /私聊窗體代碼 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會議客戶端 /會議窗體代碼 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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《漢語閱讀教程》課件-教學課件:漢語閱讀教程
- 2025解除租賃合同模板
- 2025企業(yè)勞動合同書模板
- 2025中級會計實務預習知識考點:合同收入確認
- 2025兼職國慶節(jié)臨時工合同范文
- 《蟋蟀的住宅》教學設計和反思
- 2025年房地產(chǎn)經(jīng)紀人之業(yè)務操作過關檢測試卷B卷附答案
- 2025年執(zhí)業(yè)藥師之中藥學專業(yè)一題庫練習試卷B卷附答案
- 新質(zhì)生產(chǎn)力解析圖
- 冷凝集素病的臨床護理
- 《美學》綜合知識近年真題考試題庫及答案(含AB卷)
- 食堂管理領導小組及工作職責
- 華南理工大學自主招生個人陳述自薦信范文
- 酒店餐飲部經(jīng)理聘用書
- 機電傳動與控制知到智慧樹章節(jié)測試課后答案2024年秋山東石油化工學院
- 行業(yè)數(shù)字化轉(zhuǎn)型推進方案
- 2023-2024網(wǎng)絡文學閱讀平臺價值研究報告
- 專題07 解析幾何(選填題)-【好題匯編】五年(2020-2024)高考數(shù)學真題分類匯編(含答案解析)
- GB/T 5534-2024動植物油脂皂化值的測定
- 《古代印度》課件
- 精神殘疾人康復培訓
評論
0/150
提交評論