Java課程設(shè)計聊天室(含代碼)_第1頁
Java課程設(shè)計聊天室(含代碼)_第2頁
Java課程設(shè)計聊天室(含代碼)_第3頁
Java課程設(shè)計聊天室(含代碼)_第4頁
Java課程設(shè)計聊天室(含代碼)_第5頁
已閱讀5頁,還剩50頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

..Java程序課程設(shè)計任務(wù)書JAVA聊天室的系統(tǒng)的設(shè)計與開發(fā)主要內(nèi)容:用JAVA實現(xiàn)基于C/S模式的聊天室系統(tǒng)。聊天室分為服務(wù)器端和客戶端兩部分,服務(wù)器端程序主要負責(zé)偵聽客戶端發(fā)來的信息,客戶端需要登陸到服務(wù)器端才可以實現(xiàn)正常的聊天功能。2.具體要求〔包括技術(shù)要求等:系統(tǒng)的功能要求:A.服務(wù)器端主要功能如下:1.在特定端口上進行偵聽,等待客戶端連接。2.用戶可以配置服務(wù)器端的偵聽端口,默認端口為8888。3.向已經(jīng)連接到服務(wù)器端的用戶發(fā)送系統(tǒng)消息。4.統(tǒng)計在線人數(shù)。5.當停止服務(wù)時,斷開所有的用戶連接。B.客戶端的主要功能如下:1.連接到已經(jīng)開啟聊天服務(wù)的服務(wù)器端。2.用戶可以配置要連接的服務(wù)器端的IP地址和端口號。3.用戶可以配置連接后顯示的用戶名。4.當服務(wù)器端開啟的話,用戶可以隨時登錄和注銷。5.用戶可以向所有人或某一個人發(fā)送消息。學(xué)習(xí)并掌握一下技術(shù):JavaJavaBean等熟練使用一下開發(fā)工具:Eclipse,JCreator等實現(xiàn)系統(tǒng)上訴的功能。3.進度安排:12月28日~12月29日:課程設(shè)計選題,查找參考資料12月30日~1月1日:完成系統(tǒng)設(shè)計1月2日~1月5日:完成程序代碼的編寫1月6日:系統(tǒng)測試與完善1月7日:完成課程設(shè)計報告,準備答辯主要參考文獻:[1].張廣彬孟紅蕊張永寶.Java課程設(shè)計〔案例精編[M].清華大學(xué)出版社.20XX版摘要在網(wǎng)絡(luò)越來越發(fā)達的今天,人們對網(wǎng)絡(luò)的依賴越來越多,越來越離不開網(wǎng)絡(luò),由此而產(chǎn)生的聊天工具越來越多,例如,國外的ICQ、國內(nèi)騰訊公司開發(fā)的OICQ?;贘ava網(wǎng)絡(luò)編程的強大功能,本次畢業(yè)設(shè)計使用Java編寫一個聊天系統(tǒng)。

一般來說,聊天工具大多數(shù)由客戶端程序和服務(wù)器程序外加服務(wù)器端用于存放客戶數(shù)據(jù)的數(shù)據(jù)庫組成,本系統(tǒng)采用客戶機/服務(wù)器架構(gòu)模式通過Java提供的Soket類來連接客戶機和服務(wù)器并使客戶機和服務(wù)器之間相互通信,由于聊天是多點對多點的而Java提供的多線程功能用多線程可完成多點對多點的聊天,數(shù)據(jù)庫管理系統(tǒng)用SQLServer2000完成并通過JDBC-ODBC橋訪問數(shù)據(jù)庫。本系統(tǒng)建立在JAVA平臺上,系統(tǒng)的設(shè)計使用了面向?qū)ο蠹夹g(shù)和面向?qū)ο蟮脑O(shè)計原則。系統(tǒng)采用C/S結(jié)構(gòu),客戶端與客戶端以及客戶端與服務(wù)器端之間通過Socket傳送消息。使用JAVA語言編寫,開發(fā)工具采用Eclipse。服務(wù)器端設(shè)計與實現(xiàn)過程中,采用了多線程技術(shù),可以在單個程序當中同時運行多個不同的線程,執(zhí)行不同的任務(wù)。大大增強了程序?qū)Ψ?wù)器資源的利用。聊天系統(tǒng)完成后將可進行多人對多人的聊天,對好友進行添加、刪除,對新用戶的注冊,發(fā)送消息、接受消息等等功能。關(guān)鍵詞:多線程;客戶機/服務(wù)器;JAVA;Socket;Eclipse;TCP/IP目錄Java程序課程設(shè)計任務(wù)書II摘要III目錄IV第1章引言11.1背景11.2課程設(shè)計內(nèi)容11.3任務(wù)分工2第2章聊天室系統(tǒng)32.1聊天室系統(tǒng)概述32.1.1聊天室系統(tǒng)的定義32.1.2聊天室系統(tǒng)的任務(wù)及目的32.2主要聊天室系統(tǒng)介紹42.3本章小結(jié)5第3章聊天室系統(tǒng)的設(shè)計63.1系統(tǒng)需求分析63.2系統(tǒng)開發(fā)及運行環(huán)境63.3系統(tǒng)主要功能要求63.4系統(tǒng)模塊化分析73.4.1聊天室系統(tǒng)總體結(jié)構(gòu)73.4.2聊天室系統(tǒng)各模塊介紹83.5系統(tǒng)數(shù)據(jù)流圖103.6本章小結(jié)10第4章系統(tǒng)的具體實現(xiàn)114.1界面設(shè)計11服務(wù)器啟動界面圖11服務(wù)器啟動成功界面圖12客戶端界面圖12用戶設(shè)置界面圖13用戶成功登錄界面圖13兩人私聊界面圖14多人群聊界面圖144.2程序設(shè)計及調(diào)試運行144.2.1程序調(diào)試〔以服務(wù)器為例154.2.2JCreator204.3本章小結(jié)21第5章結(jié)束語22致謝23附錄源代碼24..第1章引言1.1背景當今主流的聊天工具有QQ,ICQ,MSNMessenger,YahooMessenger等,國內(nèi)最熱門的當屬Q(mào)Q,騰訊QQ〔OICQ是由XX市騰訊計算機系統(tǒng)公司開發(fā)的,基于Internet的即時尋呼軟件。您可以使用QQ和好友用戶進行交流,信息即時發(fā)送,即時回復(fù),收發(fā)及時、功能全面。此外QQ還具有BP機網(wǎng)上尋呼、聊天室、傳輸文件、語音郵件、手機短訊服務(wù)等功能,QQ不僅僅是虛擬的網(wǎng)絡(luò)尋呼機,更可與傳統(tǒng)的無線尋呼網(wǎng)、GSM移動的短消息系統(tǒng)互聯(lián),目前QQ和全國多家尋呼臺、移動通信公司有業(yè)務(wù)合作。是國內(nèi)不可多得的中文網(wǎng)絡(luò)尋呼機。QQ支持顯示朋友在線信息、即時傳送信息、即時交談、即時發(fā)送文件和網(wǎng)址。QQ可以在Win95/98/NT/2000操作系統(tǒng)下運行,是十分靈活的網(wǎng)絡(luò)尋呼工具。它會自動檢查您是否已聯(lián)網(wǎng),如果您的電腦已連入Internet,可以搜索網(wǎng)友、顯示在線網(wǎng)友,可以根據(jù)QQ號、昵稱、姓名、email地址等關(guān)鍵詞來查找,找到后可加入到通訊錄中。當您的通訊錄中的網(wǎng)友在線時,QQ中朋友的頭像就會顯示在線,根據(jù)提示就可以發(fā)送信息,如果對方登記了尋呼機或開通了GSM手機短消息,即使離線了,您也可及時將信息傳遞給您的好友。雖然以上這些軟件是免費的,并且功能越來越強大。但是它們的唯一的不足就是必須要聯(lián)網(wǎng)或者下載到它們的服務(wù)端,要不然是沒法脫離Intenet使用的。為了能在一個沒有連接到Intenet的局域網(wǎng)使用聊天工具,那就必須要有服務(wù)器端。本系統(tǒng)就是包括服務(wù)器端與客戶端,可以在局域網(wǎng)聊天的一個工具。1.2課程設(shè)計內(nèi)容實現(xiàn)的是局域網(wǎng)中的聊天功能,運行服務(wù)程序后,服務(wù)器創(chuàng)建成功,然后使服務(wù)器對某一個設(shè)定的端口處于監(jiān)聽狀態(tài),當有客戶端請求建立連接時,服務(wù)器就可接受請求,建立連接!這樣服務(wù)器和客戶端就可相互發(fā)送消息,實現(xiàn)聊天功能!系統(tǒng)的功能要求:A.服務(wù)器端主要功能如下:1.在特定端口上進行偵聽,等待客戶端連接。2.用戶可以配置服務(wù)器端的偵聽端口,默認端口為8888。3.向已經(jīng)連接到服務(wù)器端的用戶發(fā)送系統(tǒng)消息。4.統(tǒng)計在線人數(shù)。5.當停止服務(wù)時,斷開所有的用戶連接。B.客戶端的主要功能如下:1.連接到已經(jīng)開啟聊天服務(wù)的服務(wù)器端。2.用戶可以配置要連接的服務(wù)器端的IP地址和端口號。3.用戶可以配置連接后顯示的用戶名。4.當服務(wù)器端開啟的話,用戶可以隨時登錄和注銷。5.用戶可以向所有人或某一個人發(fā)送消息1.3任務(wù)分工第2章聊天室系統(tǒng)2.1聊天室系統(tǒng)概述聊天室是一種基于互聯(lián)網(wǎng)的即時交流系統(tǒng),最初是ICQ,也稱網(wǎng)絡(luò)尋呼機。此類軟件使得人們可以運用連上INTERNET網(wǎng)的電腦用戶可以隨時跟另外一個在線網(wǎng)民交談,甚至可以通過視頻看到對方的適時圖像。使人們不必擔心昂貴的話費而暢快交流,并工作、交流兩不誤。2.1.1聊天室系統(tǒng)的定義聊天時系統(tǒng)是通過即時通訊技術(shù)來實現(xiàn)在線聊天、交流的軟件。目前有2種架構(gòu)形式,1、一種是C/S架構(gòu),采用客戶端/服務(wù)器形式,用戶使用過程中需要下載安裝客戶端軟件,典型的代表有:QQ、百度HI、SkypeQQVSGU、Gtalk、新浪UC、MSN等;2、采用B/S架構(gòu),即瀏覽器/服務(wù)端形式,這種形式的即時通訊軟件,直接借助互聯(lián)網(wǎng)為媒介、客戶端無需安裝任何軟件,既可以體驗服務(wù)器端進行溝通對話,一般運用在電子商務(wù)網(wǎng)站的服務(wù)商,典型的代表有Websitelive、53KF、live800等。2.1.2聊天室系統(tǒng)的任務(wù)及目的本系統(tǒng)主要通過客戶端,服務(wù)器端來體現(xiàn)聊天系統(tǒng)的基本功能?!?服務(wù)器端1.處理用戶注冊2.處理用戶登錄3.處理用戶發(fā)送信息,服務(wù)器監(jiān)控聊天內(nèi)容,服務(wù)器過濾非法內(nèi)容4.處理用戶得到信息5.處理用戶退出 8.服務(wù)器踢人。 9.保存服務(wù)器日志。10.保存用戶聊天信息?!?客戶端1.用戶注冊界面及結(jié)果 2.用戶登錄界面及結(jié)果 3.用戶發(fā)送信息界面及結(jié)果 4.用戶得到信息界面及結(jié)果 5.用戶退出界面及結(jié)果2.2主要聊天室系統(tǒng)介紹目前國內(nèi)外做聊天系統(tǒng)的公司很多,產(chǎn)品也琳瑯滿目,國內(nèi)有諸如騰訊QQ、新浪UC、網(wǎng)易泡泡等,國外有著名的MSN〔新版改名為LiveMessenger以及跨平臺Gaim等。本人取最具代表性的QQ和MSN進行了一些研究,作為我開發(fā)聊天系統(tǒng)的準備。騰訊無疑是國內(nèi)即時通訊市場的霸主,自從99年進入即時通訊領(lǐng)域并迅速占市場之后,其在國內(nèi)用戶數(shù)量始終高居榜首,即使近幾年面對微軟MSN的強大攻勢,騰訊QQ的時常占有率依然穩(wěn)步增長。騰訊的成功與其對QQ的不斷創(chuàng)新和完善是分不開的。參考了許多網(wǎng)絡(luò)上的資料,以及自己通過觀察騰訊QQ運行時的各種細節(jié)??梢源_定騰訊QQ是以多服務(wù)器提供服務(wù)、服務(wù)器總控客戶端、客戶端之間UDP直連通信的。并且在兩個客戶端之間不能建立直連的情況下,才由服務(wù)器進行中轉(zhuǎn)通信。其模型如圖1-1圖1-1騰訊QQ服務(wù)器-客戶端模型1與騰訊QQ不同,微軟的MSNMessenger只使用了TCP作為傳輸層通信協(xié)議,所有客戶端與服務(wù)器進行連接,然后通過與服務(wù)器的TCP連接進行中轉(zhuǎn)通信。其模型如圖1-2圖1-2MSN服務(wù)器-客戶端模型2騰訊使用的模型中,服務(wù)器主要處理客戶端各種狀態(tài)的控制,可以極大減輕服務(wù)器的處理壓力,但其內(nèi)部協(xié)議和實現(xiàn)復(fù)雜度都較高。而MSNMessenger所有數(shù)據(jù)都要經(jīng)過服務(wù)器,服務(wù)器壓力可想而知〔難怪平時很少見到使用MSN進行語音視頻聊天的。。2.3本章小結(jié)這一章介紹了當前聊天室系統(tǒng)應(yīng)該具備的功能模塊,并提供了市面上比較流行的聊天室系統(tǒng)作為參考。在這一章中,我們可以了解什么是聊天室系統(tǒng),當前聊天室系統(tǒng)的市場需求,還有一個聊天室系統(tǒng)應(yīng)該的開發(fā)目標。第3章聊天室系統(tǒng)的設(shè)計這一章是聊天室系統(tǒng)的設(shè)計,從系統(tǒng)需求分析開始,介紹開發(fā)環(huán)境和用到的開發(fā)工具,系統(tǒng)主要的功能設(shè)計,系統(tǒng)的數(shù)據(jù)流程圖。3.1系統(tǒng)需求分析聊天室的設(shè)計目標:通過做鞏固所學(xué)Java語言基本知識,增進Java語言編輯基本功,掌握JDK、JCreator等開發(fā)工具的運用,拓寬常用類庫的應(yīng)用,用JAVA實現(xiàn)基于C/S模式的聊天室系統(tǒng)。3.2系統(tǒng)開發(fā)及運行環(huán)境硬件平臺:CPU:Pentium2.8GHz以上。內(nèi)存:256MB以上。軟件平臺:操作系統(tǒng):WindowsXP。運行環(huán)境:JDKVersion1.6JCreator。3.3系統(tǒng)主要功能要求本系統(tǒng)針對局域網(wǎng)進行聯(lián)機聊天。聊天室分為服務(wù)器端和客戶端兩部分,服務(wù)器端程序主要負責(zé)偵聽客戶端發(fā)來的信息,客戶端需要登陸到服務(wù)器端才可以實現(xiàn)正常的聊天功能。本系統(tǒng)主要實現(xiàn)如下功能:服務(wù)器:在特定端口上進行偵聽,等待客戶端連接。用戶可以配置服務(wù)器端的偵聽端口,默認端口為8888。向已經(jīng)連接到服務(wù)器端的用戶發(fā)送系統(tǒng)消息。統(tǒng)計在線人數(shù)。當停止服務(wù)時,斷開所有的用戶連接。系統(tǒng)運行穩(wěn)定、安全可靠。一臺主機只能啟動一個服務(wù)器。客戶端:連接到已經(jīng)開啟聊天服務(wù)的服務(wù)器端。用戶可以配置要連接的服務(wù)器端的IP地址和端口號。用戶可以配置連接后顯示的用戶名。用戶可以更改聊天時的表情。當服務(wù)器端開啟后,用戶可以隨時登錄和注銷。用戶可以向所有人或某一個人發(fā)送消息。系統(tǒng)運行穩(wěn)定、安全可靠??梢阅J連接到自己主機啟動的服務(wù)器。3.4系統(tǒng)模塊化分析3.4.1聊天室系統(tǒng)總體結(jié)構(gòu)主要功能框架如下圖所示:系統(tǒng)消息連接設(shè)置退出注銷發(fā)送消息登錄用戶設(shè)置客戶端啟動服務(wù)退出停止服務(wù)端口設(shè)置服務(wù)器系統(tǒng)消息連接設(shè)置退出注銷發(fā)送消息登錄用戶設(shè)置客戶端啟動服務(wù)退出停止服務(wù)端口設(shè)置服務(wù)器各功能模塊實現(xiàn)的功能為:服務(wù)器: 端口設(shè)置:設(shè)置傾聽的端口號,默認為8888。 啟動服務(wù):開啟傾聽端口,允許客戶端連接。 系統(tǒng)消息:服務(wù)器啟動后可以在聊天室內(nèi)發(fā)送消息。 停止服務(wù):關(guān)閉傾聽端口,中斷所有客戶端的連接。 退出:關(guān)閉服務(wù)器。 客戶端: 用戶設(shè)置:設(shè)置聊天時顯示的名稱,默認為匆匆過客。 連接設(shè)置:設(shè)置要連接的服務(wù)器所在主機的IP地址和傾聽端口。 登錄:連接服務(wù)器。 發(fā)送消息:進行聊天,可單獨發(fā)送消息給聊天室中的一個人。 注銷:與服務(wù)器斷開連接。 退出:關(guān)閉客戶端。3.4.2聊天室系統(tǒng)各模塊介紹服務(wù)器包含服務(wù)、幫助、聊天三大模塊,其中服務(wù)模塊包含端口設(shè)置、啟動服務(wù)、停止服務(wù)和退出四個小模塊聊天模塊可以向聊天室內(nèi)所有人或個人發(fā)送系統(tǒng)消息或以管理員身份與其他人聊天表3-1服務(wù)器各模塊名稱功能匯總表序號模塊名基本功能1端口設(shè)置設(shè)置傾聽的端口號,默認為8888。2啟動服務(wù)開啟傾聽端口,允許客戶端連接。3停止服務(wù)關(guān)閉傾聽端口,中斷所有客戶端的連接。4退出關(guān)閉服務(wù)器。5幫助顯示各個模塊的功能及操作方法。6發(fā)送向聊天室內(nèi)發(fā)送系統(tǒng)消息??蛻舳税僮?、設(shè)置、幫助、聊天四大模塊,其中操作包含用戶登錄、用戶注銷和退出三個小模塊,設(shè)置包含用戶設(shè)置和連接設(shè)置兩個小模塊聊天模塊除具備普通聊天功能外,還能進行聊天時的表情選擇表3-2客戶端各模塊名稱功能匯總表序號模塊名基本功能1用戶設(shè)置設(shè)置聊天時顯示的名稱,默認為匆匆過客。2連接設(shè)置設(shè)置要連接的服務(wù)器所在主機的IP地址和傾聽端口。3用戶登錄連接到服務(wù)器端。4用戶注銷與服務(wù)器斷開連接。5退出關(guān)閉客戶端。6發(fā)送發(fā)送聊天內(nèi)容7悄悄話聊天內(nèi)容不會被服務(wù)器和說話對象以外的人看到3.5系統(tǒng)數(shù)據(jù)流圖悄悄話客戶端A客戶端E客戶端D客戶端C客戶端B服務(wù)器悄悄話客戶端A客戶端E客戶端D客戶端C客戶端B服務(wù)器系統(tǒng)數(shù)據(jù)流圖3.6本章小結(jié)本章是聊天室系統(tǒng)的具體設(shè)計過程,有具體的需求分析、系統(tǒng)功能模塊、系統(tǒng)數(shù)據(jù)流圖。這里我們開始接觸聊天室系統(tǒng)開發(fā)的最初步驟,也是很重要的一步。第4章系統(tǒng)的具體實現(xiàn)界面是系統(tǒng)之間最直接的交互界面,界面的友好性體現(xiàn)了軟件設(shè)計的質(zhì)量,并在很大程度上決定了軟件是否成功。4.1界面設(shè)計4.1.1服務(wù)器啟動界面圖4.1.2服務(wù)器啟動成功界面圖4.1.3客戶端界面圖4.1.4用戶設(shè)置界面圖4.1.5用戶成功登錄界面圖4.1.6兩人私聊界面圖4.1.7多人群聊界面圖4.2程序設(shè)計及調(diào)試運行利用JCreator"一次編寫,各處運行"的編程優(yōu)點,按功能模塊結(jié)構(gòu)設(shè)計菜單,布置各明細模塊工作界面,編寫各個模塊的程序代碼,進行編譯連接運行,經(jīng)過反復(fù)調(diào)試修改,以達到系統(tǒng)功能要求。這個過程具有大量的工作量,應(yīng)仔細對每個程序細節(jié)進行分析思考、編寫程序并調(diào)試,做到程序簡潔清楚,盡量避免可能潛在的程序錯誤,并在必要的地方加以注釋,以便于程序閱讀和修改。4.2.1程序調(diào)試〔以服務(wù)器為例importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.event.*;.*;importjava.io.*;/**聊天服務(wù)端的主框架類*/publicclassChatServerextendsJFrameimplementsActionListener{ publicstaticintport=8888;//服務(wù)端的偵聽端口 ServerSocketserverSocket;//服務(wù)端Socket Imageicon;//程序圖標 JComboBoxcombobox;//選擇發(fā)送消息的接受者 JTextAreamessageShow;//服務(wù)端的信息顯示 JScrollPanemessageScrollPane;//信息顯示的滾動條 JTextFieldshowStatus;//顯示用戶連接狀態(tài) JLabelsendToLabel,messageLabel; JTextFieldsysMessage;//服務(wù)端消息的發(fā)送 uttonsysMessageButton;//服務(wù)端消息的發(fā)送按鈕 UserLinkListuserLinkList;//用戶鏈表 //建立菜單欄 JMenuBarjMenuBar=newJMenuBar<>; //建立菜單組 JMenuserviceMenu=newJMenu<"服務(wù)<V>">; //建立菜單項 JMenuItemportItem=newJMenuItem<"端口設(shè)置<P>">; JMenuItemstartItem=newJMenuItem<"啟動服務(wù)<S>">; JMenuItemstopItem=newJMenuItem<"停止服務(wù)<T>">; JMenuItemexitItem=newJMenuItem<"退出<X>">; JMenuhelpMenu=newJMenu<"幫助<H>">; JMenuItemhelpItem=newJMenuItem<"幫助<H>">; //建立工具欄 JToolBartoolBar=newJToolBar<>; //建立工具欄中的按鈕組件 uttonportSet;//啟動服務(wù)端偵聽 uttonstartServer;//啟動服務(wù)端偵聽 uttonstopServer;//關(guān)閉服務(wù)端偵聽 uttonexitButton;//退出按鈕 //框架的大小 DimensionfaceSize=newDimension<400,600>; ServerListenlistenThread; JPaneldownPanel; GridBagLayoutgirdBag; GridBagConstraintsgirdBagCon;/** *服務(wù)端構(gòu)造函數(shù) */ publicChatServer<>{ init<>;//初始化程序 //添加框架的關(guān)閉事件處理 this.setDefaultCloseOperation<JFrame.EXIT_ON_CLOSE>; this.pack<>; //設(shè)置框架的大小 this.setSize<faceSize>; //設(shè)置運行時窗口的位置 DimensionscreenSize=Toolkit.getDefaultToolkit<>.getScreenSize<>; this.setLocation<<int><screenSize.width-faceSize.getWidth<>>/2, <int><screenSize.height-faceSize.getHeight<>>/2>; this.setResizable<false>; this.setTitle<"聊天室服務(wù)端">;//設(shè)置標題 //程序圖標 icon=getImage<"icon.gif">; this.setIconImage<icon>;//設(shè)置程序圖標 show<>; //為服務(wù)菜單欄設(shè)置熱鍵'V' serviceMenu.setMnemonic<'V'>; //為端口設(shè)置快捷鍵為ctrl+p portItem.setMnemonic<'P'>; portItem.setAccelerator<KeyStroke.getKeyStroke<KeyEvent.VK_P,InputEvent.CTRL_MASK>>; //為啟動服務(wù)快捷鍵為ctrl+s startItem.setMnemonic<'S'>; startItem.setAccelerator<KeyStroke.getKeyStroke<KeyEvent.VK_S,InputEvent.CTRL_MASK>>; //為端口設(shè)置快捷鍵為ctrl+T stopItem.setMnemonic<'T'>; stopItem.setAccelerator<KeyStroke.getKeyStroke<KeyEvent.VK_T,InputEvent.CTRL_MASK>>; //為退出設(shè)置快捷鍵為ctrl+x exitItem.setMnemonic<'X'>; exitItem.setAccelerator<KeyStroke.getKeyStroke<KeyEvent.VK_X,InputEvent.CTRL_MASK>>; //為幫助菜單欄設(shè)置熱鍵'H' helpMenu.setMnemonic<'H'>; //為幫助設(shè)置快捷鍵為ctrl+p helpItem.setMnemonic<'H'>; helpItem.setAccelerator<KeyStroke.getKeyStroke<KeyEvent.VK_H,InputEvent.CTRL_MASK>>; } /** *程序初始化函數(shù) */ publicvoidinit<>{ ContainercontentPane=getContentPane<>; contentPane.setLayout<newBorderLayout<>>; //添加菜單欄 serviceMenu.add<portItem>; serviceMenu.add<startItem>; serviceMenu.add<stopItem>; serviceMenu.add<exitItem>; jMenuBar.add<serviceMenu>; helpMenu.add<helpItem>; jMenuBar.add<helpMenu>; setJMenuBar<jMenuBar>; //初始化按鈕 portSet=newutton<"端口設(shè)置">; startServer=newutton<"啟動服務(wù)">; stopServer=newutton<"停止服務(wù)">; exitButton=newutton<"退出">; //將按鈕添加到工具欄 toolBar.add<portSet>; toolBar.addSeparator<>;//添加分隔欄 toolBar.add<startServer>; toolBar.add<stopServer>; toolBar.addSeparator<>;//添加分隔欄 toolBar.add<exitButton>; contentPane.add<toolBar,BorderLayout.NORTH>; //初始時,令停止服務(wù)按鈕不可用 stopServer.setEnabled<false>; stopItem.setEnabled<false>; //為菜單欄添加事件監(jiān)聽 portItem.addActionListener<this>; startItem.addActionListener<this>; stopItem.addActionListener<this>; exitItem.addActionListener<this>; helpItem.addActionListener<this>; //添加按鈕的事件偵聽 portSet.addActionListener<this>; startServer.addActionListener<this>; stopServer.addActionListener<this>; exitButton.addActionListener<this>;combobox=newJComboBox<>; combobox.insertItemAt<"所有人",0>; combobox.setSelectedIndex<0>; messageShow=newJTextArea<>; messageShow.setEditable<false>; //添加滾動條 messageScrollPane=newJScrollPane<messageShow, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED>; messageScrollPane.setPreferredSize<newDimension<400,400>>; messageScrollPane.revalidate<>; showStatus=newJTextField<35>; showStatus.setEditable<false>; sysMessage=newJTextField<24>; sysMessage.setEnabled<false>; sysMessageButton=newutton<>; sysMessageButton.setText<"發(fā)送">; //添加系統(tǒng)消息的事件偵聽 sysMessage.addActionListener<this>; sysMessageButton.addActionListener<this>; sendToLabel=newJLabel<"發(fā)送至:">; messageLabel=newJLabel<"發(fā)送消息:">; downPanel=newJPanel<>; girdBag=newGridBagLayout<>; downPanel.setLayout<girdBag>; girdBagCon=newGridBagConstraints<>; girdBagCon.gridx=0; girdBagCon.gridy=0; girdBagCon.gridwidth=3; girdBagCon.gridheight=2; girdBagCon.ipadx=5; girdBagCon.ipady=5; JLabelnone=newJLabel<"">; girdBag.setConstraints<none,girdBagCon>; downPanel.add<none>; girdBagCon=newGridBagConstraints<>; girdBagCon.gridx=0; girdBagCon.gridy=2; girdBagCon.insets=newInsets<1,0,0,0>; girdBagCon.ipadx=5; girdBagCon.ipady=5; girdBag.setConstraints<sendToLabel,girdBagCon>; downPanel.add<sendToLabel>; girdBagCon=newGridBagConstraints<>; girdBagCon.gridx=1; girdBagCon.gridy=2; girdBagCon.anchor=GridBagConstraints.LINE_START; girdBag.setConstraints<combobox,girdBagCon>; downPanel.add<combobox>; girdBagCon=newGridBagConstraints<>; girdBagCon.gridx=0; girdBagCon.gridy=3; girdBag.setConstraints<messageLabel,girdBagCon>; downPanel.add<messageLabel>; girdBagCon=newGridBagConstraints<>; girdBagCon.gridx=1; girdBagCon.gridy=3; girdBag.setConstraints<sysMessage,girdBagCon>; downPanel.add<sysMessage>; girdBagCon=newGridBagConstraints<>; girdBagCon.gridx=2; girdBagCon.gridy=3; girdBag.setConstraints<sysMessageButton,girdBagCon>; downPanel.add<sysMessageButton>; girdBagCon=newGridBagConstraints<>; girdBagCon.gridx=0; girdBagCon.gridy=4; girdBagCon.gridwidth=3; girdBag.setConstraints<showStatus,girdBagCon>; downPanel.add<showStatus>; contentPane.add<messageScrollPane,BorderLayout.CENTER>; contentPane.add<downPanel,BorderLayout.SOUTH>; //關(guān)閉程序時的操作 this.addWindowListener< newWindowAdapter<>{ publicvoidwindowClosing<WindowEvente>{ stopService<>; System.exit<0>; } } >; } /** *事件處理 */ publicvoidactionPerformed<ActionEvente>{ Objectobj=e.getSource<>; if<obj==startServer||obj==startItem>{//啟動服務(wù)端 startService<>; } elseif<obj==stopServer||obj==stopItem>{//停止服務(wù)端 intj=JOptionPane.showConfirmDialog< this,"真的停止服務(wù)嗎?","停止服務(wù)", JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE>; if<j==JOptionPane.YES_OPTION>{ stopService<>; } } elseif<obj==portSet||obj==portItem>{//端口設(shè)置 //調(diào)出端口設(shè)置的對話框 PortConfportConf=newPortConf<this>; portConf.show<>; } elseif<obj==exitButton||obj==exitItem>{//退出程序 intj=JOptionPane.showConfirmDialog< this,"真的要退出嗎?","退出", JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE>; if<j==JOptionPane.YES_OPTION>{ stopService<>; System.exit<0>; } } elseif<obj==helpItem>{//菜單欄中的幫助 //調(diào)出幫助對話框 HelphelpDialog=newHelp<this>; helpDialog.show<>; } elseif<obj==sysMessage||obj==sysMessageButton>{//發(fā)送系統(tǒng)消息 sendSystemMessage<>; } } /** *啟動服務(wù)端 */ publicvoidstartService<>{ try{ serverSocket=newServerSocket<port,10>; messageShow.append<"服務(wù)端已經(jīng)啟動,在"+port+"端口偵聽...\n">; startServer.setEnabled<false>; startItem.setEnabled<false>; portSet.setEnabled<false>; portItem.setEnabled<false>; stopServer.setEnabled<true>; stopItem.setEnabled<true>; sysMessage.setEnabled<true>; } catch<Exceptione>{ //System.out.println<e>; } userLinkList=newUserLinkList<>; listenThread=newServerListen<serverSocket,combobox, messageShow,showStatus,userLinkList>; listenThread.start<>;} /** *關(guān)閉服務(wù)端 */4.2.2JCreatorJcreator是一個用于Java程序設(shè)計的集成開發(fā)環(huán)境,具有編輯、調(diào)試、運行Java程序的功能。當前最新版本是Jcreator3.10,它又分為LE和Pro版本。LE版本功能上受到一些限制,是免費版本。Pro版本功能最全,但這個版本是一個共享軟件。這個軟件比較小巧,對硬件要求不是很高,完全用C++寫的,速度快、效率高。具有語法著色、代碼自動完成、代碼參數(shù)提示、工程向?qū)?、類向?qū)У裙δ?。第一次啟動時提示設(shè)置JavaJDK主目錄及JDKJavaDoc目錄,軟件自動設(shè)置好類路徑、編譯器及解釋器路徑,還可以在幫助菜單中使用JDKHelp。4.3本章小結(jié)本章介紹了系統(tǒng)的具體實現(xiàn)和部分關(guān)鍵代碼,其中包括用戶登錄所要用到的函數(shù)和主界面的框架設(shè)計。第5章結(jié)束語本文討論了如何利用JAVA技術(shù)開發(fā)聊天室系統(tǒng),基本滿足了結(jié)構(gòu)化、界面友好、速度快、安全性以及穩(wěn)定性等特點。系統(tǒng)著重研究并實現(xiàn)了網(wǎng)絡(luò)應(yīng)用的部分。根據(jù)實現(xiàn)的情況看,具有較友好的聊天界面生成效果,以及流暢的網(wǎng)絡(luò)通信效果。生成的聊天室可以達到基本的聊天要求,具有較高的研究價值。系統(tǒng)具有目前聊天室的基本功能:包括支持語氣選擇,支持私聊,可以給所有聊友發(fā)公共信息,具有速度快,高穩(wěn)定性,占用系統(tǒng)資源少,用戶界面友好等特點。通過畢業(yè)設(shè)計,發(fā)現(xiàn)自己在理論研究和實際工作能力等方面都得到了提高,受益匪淺,同時在老師的指導(dǎo)和課題組同學(xué)的共同幫助下,及時總結(jié)研究成果,這些無疑會對我今后的工作和學(xué)習(xí)帶來很大的幫助。致謝附錄源代碼importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.event.*;.*;importjava.io.*;/**聊天服務(wù)端的主框架類*/publicclassChatServerextendsJFrameimplementsActionListener{ publicstaticintport=8888;//服務(wù)端的偵聽端口 ServerSocketserverSocket;//服務(wù)端Socket Imageicon;//程序圖標 JComboBoxcombobox;//選擇發(fā)送消息的接受者 JTextAreamessageShow;//服務(wù)端的信息顯示 JScrollPanemessageScrollPane;//信息顯示的滾動條 JTextFieldshowStatus;//顯示用戶連接狀態(tài) JLabelsendToLabel,messageLabel; JTextFieldsysMessage;//服務(wù)端消息的發(fā)送 uttonsysMessageButton;//服務(wù)端消息的發(fā)送按鈕 UserLinkListuserLinkList;//用戶鏈表 //建立菜單欄 JMenuBarjMenuBar=newJMenuBar<>; //建立菜單組 JMenuserviceMenu=newJMenu<"服務(wù)<V>">; //建立菜單項 JMenuItemportItem=newJMenuItem<"端口設(shè)置<P>">; JMenuItemstartItem=newJMenuItem<"啟動服務(wù)<S>">; JMenuItemstopItem=newJMenuItem<"停止服務(wù)<T>">;JMenuItemexitItem=newJMenuItem<"退出<X>">; JMenuhelpMenu=newJMenu<"幫助<H>">; JMenuItemhelpItem=newJMenuItem<"幫助<H>">; //建立工具欄 JToolBartoolBar=newJToolBar<>; //建立工具欄中的按鈕組件 uttonportSet;//啟動服務(wù)端偵聽 uttonstartServer;//啟動服務(wù)端偵聽 uttonstopServer;//關(guān)閉服務(wù)端偵聽 uttonexitButton;//退出按鈕 //框架的大小 DimensionfaceSize=newDimension<400,600>; ServerListenlistenThread; JPaneldownPanel; GridBagLayoutgirdBag; GridBagConstraintsgirdBagCon; /** *服務(wù)端構(gòu)造函數(shù) */ publicChatServer<>{ init<>;//初始化程序 //添加框架的關(guān)閉事件處理 this.setDefaultCloseOperation<JFrame.EXIT_ON_CLOSE>; this.pack<>; //設(shè)置框架的大小 this.setSize<faceSize>; //設(shè)置運行時窗口的位置 DimensionscreenSize=Toolkit.getDefaultToolkit<>.getScreenSize<>; this.setLocation<<int><screenSize.width-faceSize.getWidth<>>/2, <int><screenSize.height-faceSize.getHeight<>>/2>; this.setResizable<false>; this.setTitle<"聊天室服務(wù)端">;//設(shè)置標題 //程序圖標 icon=getImage<"icon.gif">; this.setIconImage<icon>;//設(shè)置程序圖標 show<>; //為服務(wù)菜單欄設(shè)置熱鍵'V' serviceMenu.setMnemonic<'V'>; //為端口設(shè)置快捷鍵為ctrl+p portItem.setMnemonic<'P'>; portItem.setAccelerator<KeyStroke.getKeyStroke<KeyEvent.VK_P,InputEvent.CTRL_MASK>>; //為啟動服務(wù)快捷鍵為ctrl+s startItem.setMnemonic<'S'>; startItem.setAccelerator<KeyStroke.getKeyStroke<KeyEvent.VK_S,InputEvent.CTRL_MASK>>; //為端口設(shè)置快捷鍵為ctrl+T stopItem.setMnemonic<'T'>; stopItem.setAccelerator<KeyStroke.getKeyStroke<KeyEvent.VK_T,InputEvent.CTRL_MASK>>; //為退出設(shè)置快捷鍵為ctrl+x exitItem.setMnemonic<'X'>; exitItem.setAccelerator<KeyStroke.getKeyStroke<KeyEvent.VK_X,InputEvent.CTRL_MASK>>; //為幫助菜單欄設(shè)置熱鍵'H' helpMenu.setMnemonic<'H'>; //為幫助設(shè)置快捷鍵為ctrl+p helpItem.setMnemonic<'H'>; helpItem.setAccelerator<KeyStroke.getKeyStroke<KeyEvent.VK_H,InputEvent.CTRL_MASK>>; } /** *程序初始化函數(shù) */ publicvoidinit<>{ ContainercontentPane=getContentPane<>; contentPane.setLayout<newBorderLayout<>>; //添加菜單欄 serviceMenu.add<portItem>; serviceMenu.add<startItem>; serviceMenu.add<stopItem>; serviceMenu.add<exitItem>; jMenuBar.add<serviceMenu>; helpMenu.add<helpItem>; jMenuBar.add<helpMenu>; setJMenuBar<jMenuBar>; //初始化按鈕 portSet=newutton<"端口設(shè)置">; startServer=newutton<"啟動服務(wù)">; stopServer=newutton<"停止服務(wù)">; exitButton=newutton<"退出">; //將按鈕添加到工具欄 toolBar.add<portSet>; toolBar.addSeparator<>;//添加分隔欄 toolBar.add<startServer>; toolBar.add<stopServer>; toolBar.addSeparator<>;//添加分隔欄 toolBar.add<exitButton>; contentPane.add<toolBar,BorderLayout.NORTH>; //初始時,令停止服務(wù)按鈕不可用 stopServer.setEnabled<false>; stopItem.setEnabled<false>; //為菜單欄添加事件監(jiān)聽 portItem.addActionListener<this>; startItem.addActionListener<this>; stopItem.addActionListener<this>; exitItem.addActionListener<this>; helpItem.addActionListener<this>; //添加按鈕的事件偵聽 portSet.addActionListener<this>; startServer.addActionListener<this>; stopServer.addActionListener<this>; exitButton.addActionListener<this>; combobox=newJComboBox<>; combobox.insertItemAt<"所有人",0>; combobox.setSelectedIndex<0>; messageShow=newJTextArea<>; messageShow.setEditable<false>//添加滾動條 messageScrollPane=newJScrollPane<messageShow, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED>; messageScrollPane.setPreferredSize<newDimension<400,400>>; messageScrollPane.revalidate<>; showStatus=newJTextField<35>; showStatus.setEditable<false>; sysMessage=newJTextField<24>; sysMessage.setEnabled<false>; sysMessageButton=newutton<>; sysMessageButton.setText<"發(fā)送">;//添加系統(tǒng)消息的事件偵聽 sysMessage.addActionListener<this>; sysMessageButton.addActionListener<this>; sendToLabel=newJLabel<"發(fā)送至:">; messageLabel=newJLabel<"發(fā)送消息:">; downPanel=newJPanel<>; girdBag=newGridBagLayout<>; downPanel.setLayout<girdBag>; girdBagCon=newGridBagConstraints<>; girdBagCon.gridx=0; girdBagCon.gridy=0; girdBagCon.gridwidth=3; girdBagCon.gridheight=2; girdBagCon.ipadx=5; girdBagCon.ipady=5; JLabelnone=newJLabel<"">; girdBag.setConstraints<none,girdBagCon>; downPanel.add<none>; girdBagCon=newGridBagConstraints<>; girdBagCon.gridx=0; girdBagCon.gridy=2; girdBagCon.insets=newInsets<1,0,0,0>; girdBagCon.ipadx=5; girdBagCon.ipady=5; girdBag.setConstraints<sendToLabel,girdBagCon>; downPanel.add<sendToLabel>; girdBagCon=newGridBagConstraints<>; girdBagCon.gridx=1; girdBagCon.gridy=2; girdBagCon.anchor=GridBagConstraints.LINE_START; girdBag.setConstraints<combobox,girdBagCon>; downPanel.add<combobox>; girdBagCon=newGridBagConstraints<>; girdBagCon.gridx=0; girdBagCon.gridy=3; girdBag.setConstraints<messageLabel,girdBagCon>; downPanel.add<messageLabel>; girdBagCon=newGridBagConstraints<>; girdBagCon.gridx=1; girdBagCon.gridy=3; girdBag.setConstraints<sysMessage,girdBagCon>; downPanel.add<sysMessage>; girdBagCon=newGridBagConstraints<>; girdBagCon.gridx=2; girdBagCon.gridy=3; girdBag.setConstraints<sysMessageButton,girdBagCon>; downPanel.add<sysMessageButton>; girdBagCon=newGridBagConstraints<>; girdBagCon.gridx=0; girdBagCon.gridy=4; girdBagCon.gridwidth=3; girdBag.setConstraints<showStatus,girdBagCon>; downPanel.add<showStatus>; contentPane.add<messageScrollPane,BorderLayout.CENTER>; contentPane.add<downPanel,BorderLayout.SOUTH>; //關(guān)閉程序時的操作 this.addWindowListener< newWindowAdapter<>{ publicvoidwindowClosing<WindowEvente>{ stopService<>; System.exit<0>; } } >; } /** *事件處理 */ publicvoidactionPerformed<ActionEvente>{ Objectobj=e.getSource<>; if<obj==startServer||obj==startItem>{//啟動服務(wù)端 startService<>; } elseif<obj==stopServer||obj==stopItem>{//停止服務(wù)端 intj=JOptionPane.showConfirmDialog< this,"真的停止服務(wù)嗎?","停止服務(wù)", JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE>; if<j==JOptionPane.YES_OPTION>{ stopService<>; } } elseif<obj==portSet||obj==portItem>{//端口設(shè)置 //調(diào)出端口設(shè)置的對話框 PortConfportConf=newPortConf<this>; portConf.show<>; } elseif<obj==exitButton||obj==exitItem>{//退出程序 intj=JOptionPane.showConfirmDialog< this,"真的要退出嗎?","退出", JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE>; if<j==JOptionPane.YES_OPTION>{ stopService<>; System.exit<0>; } } elseif<obj==helpItem>{//菜單欄中的幫助 //調(diào)出幫助對話框 HelphelpDialog=newHelp<this>; helpDialog.show<>; } elseif<obj==sysMessage||obj==sysMessageButton>{//發(fā)送系統(tǒng)消息 sendSystemMessage<>; } } /** *啟動服務(wù)端 */ publicvoidstartService<>{ try{ serverSocket=newServerSocket<port,10>; messageShow.append<"服務(wù)端已經(jīng)啟動,在"+port+"端口偵聽...\n">; startServer.setEnabled<false>; startItem.setEnabled<false>; portSet.setEnabled<false>; portItem.setEnabled<false>; stopServer.setEnabled<true>; stopItem.setEnabled<true>; sysMessage.setEnabled<true>; } catch<Exceptione>{ //System.out.println<e>; } userLinkList=newUserLinkList<>; listenThread=newServerListen<serverSocket,combobox, messageShow,showStatus,userLinkList>; listenThread.start<>; } /** *關(guān)閉服務(wù)端 */ publicvoidstopService<>{ try{ //向所有人發(fā)送服務(wù)器關(guān)閉的消息 sendStopToAll<>; listenThread.isStop=true; serverSocket.close<>; intcount=userLinkList.getCount<>; inti=0; while<i<count>{ Nodenode=userLinkList.findUser<i>; node.input.close<>; node.output.close<>; node.socket.close<>; i++; } stopServer.setEnabled<false>; stopItem.setEnabled<false>; startServer.setEnabled<true>; startItem.setEnabled<true>; portSet.setEnabled<true>; portItem.setEnabled<true>; sysMessage.setEnabled<false>; messageShow.append<"服務(wù)端已經(jīng)關(guān)閉\n">; combobox.removeAllItems<>; combobox.addItem<"所有人">; } catch<Exceptione>{ //System.out.println<e>; } } /** *向所有人發(fā)送服務(wù)器關(guān)閉的消息 */ publicvoidsendStopToAll<>{ intcount=userLinkList.getCount<>; inti=0; while<i<count>{ Nodenode=userLinkList.findUser<i>; if<node==null>{ i++; continue; } try{ node.output.writeObject<"服務(wù)關(guān)閉">; node.output.flush<>; } catch<Exceptione>{ //System.out.println<"$$$"+e>; } i++; } } /** *向所有人發(fā)送消息 */ publicvoidsendMsgToAll<Stringmsg>{ intcount=userLinkList.getCount<>;//用戶總數(shù) inti=0; while<i<count>{ Nodenode=userLinkList.findUser<i>; if<node==null>{ i++; continue; } try{ node.output.writeObject<"系統(tǒng)信息">; node.output.flush<>; node.output.writeObject<msg>; node.output.flush<>; } catch<Exceptione>{ //System.out.println<""+e>; } i++; } sysMessage.setText<"">; } /** *向客戶端用戶發(fā)送消息 */ publicvoidsendSystemMessage<>{ StringtoSomebody=combobox.getSelectedItem<>.toString<>; Stringmessage=sysMessage.getText<>+"\n"; messageShow.append<message>; //向所有人發(fā)送消息 if<toSomebody.equalsIgnoreCase<"所有人">>{ sendMsgToAll<message>; } else{ //向某個用戶發(fā)送消息 Nodenode=userLinkList.findUser<toSomebody>; try{ node.output.writeObject<"系統(tǒng)信息">; node.output.flush<>; node.output.writeObject<message>; node.output.flush<>; } catch<Exceptione>{ //System.out.println<"!!!"+e>; } sysMessage.setText<"">;//將發(fā)送消息欄的消息清空 } } /** *通過給定的文件名獲得圖像 */ ImagegetImage<Stringfilename>{ URLClassLoaderurlLoader=<URLClassLoader>this.getClass<>. getClassLoader<>; URLurl=null; Imageimage=null; url=urlLoader.findResource<filename>; image=Toolkit.getDefaultToolkit<>.getImage<url>; MediaTrackermediatracker=newMediaTracker<this>; try{ mediatracker.addImage<image,0>; mediatracker.waitForID<0>; } catch<InterruptedException_ex>{ image=null; } if<mediatracker.i

溫馨提示

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

最新文檔

評論

0/150

提交評論