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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

一般來說,聊天工具大多數(shù)由客戶端程序和服務器程序外加服務器端用于存放客戶數(shù)據(jù)的數(shù)據(jù)庫組成,本系統(tǒng)采用客戶機/服務器架構模式通過Java提供的Soket類來連接客戶機和服務器并使客戶機和服務器之間相互通信,由于聊天是多點對多點的而Java提供的多線程功能用多線程可完成多點對多點的聊天,數(shù)據(jù)庫管理系統(tǒng)用SQLServer2000完成并通過JDBC-ODBC橋訪問數(shù)據(jù)庫。本系統(tǒng)建立在JAVA平臺上,系統(tǒng)的設計使用了面向對象技術和面向對象的設計原則。系統(tǒng)采用C/S結構,客戶端與客戶端以與客戶端與服務器端之間通過Socket傳送消息。使用JAVA語言編寫,開發(fā)工具采用Eclipse。服務器端設計與實現(xiàn)過程中,采用了多線程技術,可以在單個程序當中同時運行多個不同的線程,執(zhí)行不同的任務。大大增強了程序對服務器資源的利用。聊天系統(tǒng)完成后將可進行多人對多人的聊天,對好友進行添加、刪除,對新用戶的注冊,發(fā)送消息、接受消息等等功能。關鍵詞:多線程;客戶機/服務器;JAVA;Socket;Eclipse;TCP/IP目錄Java程序課程設計任務書 II摘要 III目錄 IV第1章引言 11.1背景 11.2課程設計內容 11.3任務分工 2第2章聊天室系統(tǒng) 32.1聊天室系統(tǒng)概述 32.1.1聊天室系統(tǒng)的定義 32.1.2聊天室系統(tǒng)的任務與目的 32.2主要聊天室系統(tǒng)介紹 42.3本章小結 5第3章聊天室系統(tǒng)的設計 63.1系統(tǒng)需求分析 63.2系統(tǒng)開發(fā)與運行環(huán)境 63.3系統(tǒng)主要功能要求 63.4系統(tǒng)模塊化分析 73.4.1聊天室系統(tǒng)總體結構 73.4.2聊天室系統(tǒng)各模塊介紹 83.5系統(tǒng)數(shù)據(jù)流圖 103.6本章小結 10第4章系統(tǒng)的具體實現(xiàn) 114.1界面設計 114.1.1服務器啟動界面圖 114.1.2服務器啟動成功界面圖 124.1.3客戶端界面圖 124.1.4用戶設置界面圖 134.1.5用戶成功登錄界面圖 134.1.6兩人私聊界面圖 144.1.7多人群聊界面圖 144.2程序設計與調試運行 144.2.1程序調試(以服務器為例) 154.2.2JCreator 204.3本章小結 21第5章結束語 22致謝 23附錄源代碼 24第1章引言1.1背景當今主流的聊天工具有QQ,ICQ,MSNMessenger,YahooMessenger等,國內最熱門的當屬QQ,騰訊QQ(OICQ)是由深圳市騰訊計算機系統(tǒng)公司開發(fā)的,基于Internet的即時尋呼軟件。您可以使用QQ和好友用戶進行交流,信息即時發(fā)送,即時回復,收發(fā)與時、功能全面。此外QQ還具有BP機網(wǎng)上尋呼、聊天室、傳輸文件、語音郵件、手機短訊服務等功能,QQ不僅僅是虛擬的網(wǎng)絡尋呼機,更可與傳統(tǒng)的無線尋呼網(wǎng)、GSM移動電話的短消息系統(tǒng)互聯(lián),目前QQ和全國多家尋呼臺、移動通信公司有業(yè)務合作。是國內不可多得的中文網(wǎng)絡尋呼機。QQ支持顯示朋友在線信息、即時傳送信息、即時交談、即時發(fā)送文件和網(wǎng)址。QQ可以在Win95/98/NT/2000操作系統(tǒng)下運行,是十分靈活的網(wǎng)絡尋呼工具。它會自動檢查您是否已聯(lián)網(wǎng),如果您的電腦已連入Internet,可以搜索網(wǎng)友、顯示在線網(wǎng)友,可以根據(jù)QQ號、昵稱、姓名、email地址等關鍵詞來查找,找到后可加入到通訊錄中。當您的通訊錄中的網(wǎng)友在線時,QQ中朋友的頭像就會顯示在線,根據(jù)提示就可以發(fā)送信息,如果對方登記了尋呼機或開通了GSM手機短消息,即使離線了,您也可與時將信息傳遞給您的好友。雖然以上這些軟件是免費的,并且功能越來越強大。但是它們的唯一的不足就是必須要聯(lián)網(wǎng)或者下載到它們的服務端,要不然是沒法脫離Intenet使用的。為了能在一個沒有連接到Intenet的局域網(wǎng)使用聊天工具,那就必須要有服務器端。本系統(tǒng)就是包括服務器端與客戶端,可以在局域網(wǎng)聊天的一個工具。1.2課程設計內容實現(xiàn)的是局域網(wǎng)中的聊天功能,運行服務程序后,服務器創(chuàng)建成功,然后使服務器對某一個設定的端口處于監(jiān)聽狀態(tài),當有客戶端請求建立連接時,服務器就可接受請求,建立連接!這樣服務器和客戶端就可相互發(fā)送消息,實現(xiàn)聊天功能!系統(tǒng)的功能要求:A.服務器端主要功能如下:1.在特定端口上進行偵聽,等待客戶端連接。2.用戶可以配置服務器端的偵聽端口,默認端口為8888。3.向已經(jīng)連接到服務器端的用戶發(fā)送系統(tǒng)消息。4.統(tǒng)計在線人數(shù)。5.當停止服務時,斷開所有的用戶連接。B.客戶端的主要功能如下:1.連接到已經(jīng)開啟聊天服務的服務器端。2.用戶可以配置要連接的服務器端的IP地址和端口號。3.用戶可以配置連接后顯示的用戶名。4.當服務器端開啟的話,用戶可以隨時登錄和注銷。5.用戶可以向所有人或某一個人發(fā)送消息1.3任務分工第2章聊天室系統(tǒng)2.1聊天室系統(tǒng)概述聊天室是一種基于互聯(lián)網(wǎng)的即時交流系統(tǒng),最初是ICQ,也稱網(wǎng)絡尋呼機。此類軟件使得人們可以運用連上INTERNET網(wǎng)的電腦用戶可以隨時跟另外一個在線網(wǎng)民交談,甚至可以通過視頻看到對方的適時圖像。使人們不必擔心昂貴的話費而暢快交流,并工作、交流兩不誤。2.1.1聊天室系統(tǒng)的定義聊天時系統(tǒng)是通過即時通訊技術來實現(xiàn)在線聊天、交流的軟件。目前有2種架構形式,1、一種是C/S架構,采用客戶端/服務器形式,用戶使用過程中需要下載安裝客戶端軟件,典型的代表有:QQ、百度HI、SkypeQQVSGU、Gtalk、新浪UC、MSN等;2、采用B/S架構,即瀏覽器/服務端形式,這種形式的即時通訊軟件,直接借助互聯(lián)網(wǎng)為媒介、客戶端無需安裝任何軟件,既可以體驗服務器端進行溝通對話,一般運用在電子商務網(wǎng)站的服務商,典型的代表有Websitelive、53KF、live800等。2.1.2聊天室系統(tǒng)的任務與目的本系統(tǒng)主要通過客戶端,服務器端來體現(xiàn)聊天系統(tǒng)的基本功能。(1)服務器端1.處理用戶注冊2.處理用戶登錄3.處理用戶發(fā)送信息,服務器監(jiān)控聊天內容,服務器過濾非法內容4.處理用戶得到信息5.處理用戶退出 8.服務器踢人。 9.保存服務器日志。10.保存用戶聊天信息。(2)客戶端1.用戶注冊界面與結果 2.用戶登錄界面與結果 3.用戶發(fā)送信息界面與結果 4.用戶得到信息界面與結果 5.用戶退出界面與結果2.2主要聊天室系統(tǒng)介紹目前國內外做聊天系統(tǒng)的公司很多,產(chǎn)品也琳瑯滿目,國內有諸如騰訊QQ、新浪UC、網(wǎng)易泡泡等,國外有著名的MSN(新版改名為LiveMessenger)以與跨平臺Gaim等。本人取最具代表性的QQ和MSN進行了一些研究,作為我開發(fā)聊天系統(tǒng)的準備。騰訊無疑是國內即時通訊市場的霸主,自從99年進入即時通訊領域并迅速占市場之后,其在國內用戶數(shù)量始終高居榜首,即使近幾年面對微軟MSN的強大攻勢,騰訊QQ的時常占有率依然穩(wěn)步增長。騰訊的成功與其對QQ的不斷創(chuàng)新和完善是分不開的。參考了許多網(wǎng)絡上的資料,以與自己通過觀察騰訊QQ運行時的各種細節(jié)??梢源_定騰訊QQ是以多服務器提供服務、服務器總控客戶端、客戶端之間UDP直連通信的。并且在兩個客戶端之間不能建立直連的情況下,才由服務器進行中轉通信。其模型如圖1-1圖1-1騰訊QQ服務器-客戶端模型1與騰訊QQ不同,微軟的MSNMessenger只使用了TCP作為傳輸層通信協(xié)議,所有客戶端與服務器進行連接,然后通過與服務器的TCP連接進行中轉通信。其模型如圖1-2圖1-2MSN服務器-客戶端模型2騰訊使用的模型中,服務器主要處理客戶端各種狀態(tài)的控制,可以極大減輕服務器的處理壓力,但其內部協(xié)議和實現(xiàn)復雜度都較高。而MSNMessenger所有數(shù)據(jù)都要經(jīng)過服務器,服務器壓力可想而知(難怪平時很少見到使用MSN進行語音視頻聊天的)。。2.3本章小結這一章介紹了當前聊天室系統(tǒng)應該具備的功能模塊,并提供了市面上比較流行的聊天室系統(tǒng)作為參考。在這一章中,我們可以了解什么是聊天室系統(tǒng),當前聊天室系統(tǒng)的市場需求,還有一個聊天室系統(tǒng)應該的開發(fā)目標。第3章聊天室系統(tǒng)的設計這一章是聊天室系統(tǒng)的設計,從系統(tǒng)需求分析開始,介紹開發(fā)環(huán)境和用到的開發(fā)工具,系統(tǒng)主要的功能設計,系統(tǒng)的數(shù)據(jù)流程圖。3.1系統(tǒng)需求分析聊天室的設計目標:通過做鞏固所學Java語言基本知識,增進Java語言編輯基本功,掌握JDK、JCreator等開發(fā)工具的運用,拓寬常用類庫的應用,用JAVA實現(xiàn)基于C/S模式的聊天室系統(tǒng)。3.2系統(tǒng)開發(fā)與運行環(huán)境硬件平臺:CPU:Pentium2.8GHz以上。內存:256MB以上。軟件平臺:操作系統(tǒng):WindowsXP。運行環(huán)境:JDKVersion1.6JCreator。3.3系統(tǒng)主要功能要求本系統(tǒng)針對局域網(wǎng)進行聯(lián)機聊天。聊天室分為服務器端和客戶端兩部分,服務器端程序主要負責偵聽客戶端發(fā)來的信息,客戶端需要登陸到服務器端才可以實現(xiàn)正常的聊天功能。本系統(tǒng)主要實現(xiàn)如下功能:服務器:在特定端口上進行偵聽,等待客戶端連接。用戶可以配置服務器端的偵聽端口,默認端口為8888。向已經(jīng)連接到服務器端的用戶發(fā)送系統(tǒng)消息。統(tǒng)計在線人數(shù)。當停止服務時,斷開所有的用戶連接。系統(tǒng)運行穩(wěn)定、安全可靠。一臺主機只能啟動一個服務器??蛻舳耍哼B接到已經(jīng)開啟聊天服務的服務器端。用戶可以配置要連接的服務器端的IP地址和端口號。用戶可以配置連接后顯示的用戶名。用戶可以更改聊天時的表情。當服務器端開啟后,用戶可以隨時登錄和注銷。用戶可以向所有人或某一個人發(fā)送消息。系統(tǒng)運行穩(wěn)定、安全可靠??梢阅J連接到自己主機啟動的服務器。3.4系統(tǒng)模塊化分析3.4.1聊天室系統(tǒng)總體結構主要功能框架如下圖所示:系統(tǒng)消息連接設置退出注銷發(fā)送消息登錄用戶設置客戶端啟動服務退出停止服務端口設置服務器

系統(tǒng)消息連接設置退出注銷發(fā)送消息登錄用戶設置客戶端啟動服務退出停止服務端口設置服務器各功能模塊實現(xiàn)的功能為:服務器: 端口設置:設置傾聽的端口號,默認為8888。 啟動服務:開啟傾聽端口,允許客戶端連接。 系統(tǒng)消息:服務器啟動后可以在聊天室內發(fā)送消息。 停止服務:關閉傾聽端口,中斷所有客戶端的連接。 退出:關閉服務器。 客戶端: 用戶設置:設置聊天時顯示的名稱,默認為匆匆過客。 連接設置:設置要連接的服務器所在主機的IP地址和傾聽端口。 登錄:連接服務器。 發(fā)送消息:進行聊天,可單獨發(fā)送消息給聊天室中的一個人。 注銷:與服務器斷開連接。 退出:關閉客戶端。3.4.2聊天室系統(tǒng)各模塊介紹服務器包含服務、幫助、聊天三大模塊,其中服務模塊包含端口設置、啟動服務、停止服務和退出四個小模塊

聊天模塊可以向聊天室內所有人或個人發(fā)送系統(tǒng)消息或以管理員身份與其他人聊天

表3-1服務器各模塊名稱功能匯總表序號模塊名基本功能1端口設置設置傾聽的端口號,默認為8888。2啟動服務開啟傾聽端口,允許客戶端連接。3停止服務關閉傾聽端口,中斷所有客戶端的連接。4退出關閉服務器。5幫助顯示各個模塊的功能與操作方法。6發(fā)送向聊天室內發(fā)送系統(tǒng)消息??蛻舳税僮?、設置、幫助、聊天四大模塊,其中操作包含用戶登錄、用戶注銷和退出三個小模塊,設置包含用戶設置和連接設置兩個小模塊聊天模塊除具備普通聊天功能外,還能進行聊天時的表情選擇表3-2客戶端各模塊名稱功能匯總表序號模塊名基本功能1用戶設置設置聊天時顯示的名稱,默認為匆匆過客。2連接設置設置要連接的服務器所在主機的IP地址和傾聽端口。3用戶登錄連接到服務器端。4用戶注銷與服務器斷開連接。5退出關閉客戶端。6發(fā)送發(fā)送聊天內容7悄悄話聊天內容不會被服務器和說話對象以外的人看到

3.5系統(tǒng)數(shù)據(jù)流圖悄悄話客戶端A客戶端E客戶端D客戶端C客戶端B服務器悄悄話客戶端A客戶端E客戶端D客戶端C客戶端B服務器系統(tǒng)數(shù)據(jù)流圖3.6本章小結本章是聊天室系統(tǒng)的具體設計過程,有具體的需求分析、系統(tǒng)功能模塊、系統(tǒng)數(shù)據(jù)流圖。這里我們開始接觸聊天室系統(tǒng)開發(fā)的最初步驟,也是很重要的一步。第4章系統(tǒng)的具體實現(xiàn)界面是系統(tǒng)之間最直接的交互界面,界面的友好性體現(xiàn)了軟件設計的質量,并在很大程度上決定了軟件是否成功。4.1界面設計4.1.1服務器啟動界面圖4.1.2服務器啟動成功界面圖4.1.3客戶端界面圖4.1.4用戶設置界面圖4.1.5用戶成功登錄界面圖4.1.6兩人私聊界面圖4.1.7多人群聊界面圖4.2程序設計與調試運行利用JCreator“一次編寫,各處運行”的編程優(yōu)點,按功能模塊結構設計菜單,布置各明細模塊工作界面,編寫各個模塊的程序代碼,進行編譯連接運行,經(jīng)過反復調試修改,以達到系統(tǒng)功能要求。這個過程具有大量的工作量,應仔細對每個程序細節(jié)進行分析思考、編寫程序并調試,做到程序簡潔清楚,盡量避免可能潛在的程序錯誤,并在必要的地方加以注釋,以便于程序閱讀和修改。4.2.1程序調試(以服務器為例)importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.event.*;import.*;importjava.io.*;/**聊天服務端的主框架類*/publicclassChatServerextendsJFrameimplementsActionListener{ publicstaticintport=8888;//服務端的偵聽端口 ServerSocketserverSocket;//服務端Socket Imageicon;//程序圖標 JComboBoxcombobox;//選擇發(fā)送消息的接受者 JTextAreamessageShow;//服務端的信息顯示 JScrollPanemessageScrollPane;//信息顯示的滾動條 JTextFieldshowStatus;//顯示用戶連接狀態(tài) JLabelsendToLabel,messageLabel; JTextFieldsysMessage;//服務端消息的發(fā)送 JButtonsysMessageButton;//服務端消息的發(fā)送按鈕 UserLinkListuserLinkList;//用戶鏈表 //建立菜單欄 JMenuBarjMenuBar=newJMenuBar(); //建立菜單組 JMenuserviceMenu=newJMenu("服務(V)"); //建立菜單項 JMenuItemportItem=newJMenuItem("端口設置(P)"); JMenuItemstartItem=newJMenuItem("啟動服務(S)"); JMenuItemstopItem=newJMenuItem("停止服務(T)"); JMenuItemexitItem=newJMenuItem("退出(X)"); JMenuhelpMenu=newJMenu("幫助(H)"); JMenuItemhelpItem=newJMenuItem("幫助(H)"); //建立工具欄 JToolBartoolBar=newJToolBar(); //建立工具欄中的按鈕組件 JButtonportSet;//啟動服務端偵聽 JButtonstartServer;//啟動服務端偵聽 JButtonstopServer;//關閉服務端偵聽 JButtonexitButton;//退出按鈕 //框架的大小 DimensionfaceSize=newDimension(400,600); ServerListenlistenThread; JPaneldownPanel; GridBagLayoutgirdBag; GridBagConstraintsgirdBagCon;/** *服務端構造函數(shù) */ publicChatServer(){ init();//初始化程序 //添加框架的關閉事件處理 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); //設置框架的大小 this.setSize(faceSize); //設置運行時窗口的位置 DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation((int)(screenSize.width-faceSize.getWidth())/2, (int)(screenSize.height-faceSize.getHeight())/2); this.setResizable(false); this.setTitle("聊天室服務端");//設置標題 //程序圖標 icon=getImage("icon.gif"); this.setIconImage(icon);//設置程序圖標 show(); //為服務菜單欄設置熱鍵'V' serviceMenu.setMnemonic('V'); //為端口設置快捷鍵為ctrl+p portItem.setMnemonic('P'); portItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK)); //為啟動服務快捷鍵為ctrl+s startItem.setMnemonic('S'); startItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK)); //為端口設置快捷鍵為ctrl+T stopItem.setMnemonic('T'); stopItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,InputEvent.CTRL_MASK)); //為退出設置快捷鍵為ctrl+x exitItem.setMnemonic('X'); exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK)); //為幫助菜單欄設置熱鍵'H' helpMenu.setMnemonic('H'); //為幫助設置快捷鍵為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=newJButton("端口設置"); startServer=newJButton("啟動服務"); stopServer=newJButton("停止服務"); exitButton=newJButton("退出"); //將按鈕添加到工具欄 toolBar.add(portSet); toolBar.addSeparator();//添加分隔欄 toolBar.add(startServer); toolBar.add(stopServer); toolBar.addSeparator();//添加分隔欄 toolBar.add(exitButton); contentPane.add(toolBar,BorderLayout.NORTH); //初始時,令停止服務按鈕不可用 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=newJButton(); 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); //關閉程序時的操作 this.addWindowListener( newWindowAdapter(){ publicvoidwindowClosing(WindowEvente){ stopService(); System.exit(0); } } ); } /** *事件處理 */ publicvoidactionPerformed(ActionEvente){ Objectobj=e.getSource(); if(obj==startServer||obj==startItem){//啟動服務端 startService(); } elseif(obj==stopServer||obj==stopItem){//停止服務端 intj=JOptionPane.showConfirmDialog( this,"真的停止服務嗎?","停止服務", JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE); if(j==JOptionPane.YES_OPTION){ stopService(); } } elseif(obj==portSet||obj==portItem){//端口設置 //調出端口設置的對話框 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){//菜單欄中的幫助 //調出幫助對話框 HelphelpDialog=newHelp(this); helpDialog.show(); } elseif(obj==sysMessage||obj==sysMessageButton){//發(fā)送系統(tǒng)消息 sendSystemMessage(); } } /** *啟動服務端 */ publicvoidstartService(){ try{ serverSocket=newServerSocket(port,10); messageShow.append("服務端已經(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(); } /** *關閉服務端 */4.2.2JCreatorJcreator是一個用于Java程序設計的集成開發(fā)環(huán)境,具有編輯、調試、運行Java程序的功能。當前最新版本是Jcreator3.10,它又分為LE和Pro版本。LE版本功能上受到一些限制,是免費版本。Pro版本功能最全,但這個版本是一個共享軟件。這個軟件比較小巧,對硬件要求不是很高,完全用C++寫的,速度快、效率高。具有語法著色、代碼自動完成、代碼參數(shù)提示、工程向導、類向導等功能。第一次啟動時提示設置JavaJDK主目錄與JDKJavaDoc目錄,軟件自動設置好類路徑、編譯器與解釋器路徑,還可以在幫助菜單中使用JDKHelp。4.3本章小結本章介紹了系統(tǒng)的具體實現(xiàn)和部分關鍵代碼,其中包括用戶登錄所要用到的函數(shù)和主界面的框架設計。第5章結束語本文討論了如何利用JAVA技術開發(fā)聊天室系統(tǒng),基本滿足了結構化、界面友好、速度快、安全性以與穩(wěn)定性等特點。系統(tǒng)著重研究并實現(xiàn)了網(wǎng)絡應用的部分。根據(jù)實現(xiàn)的情況看,具有較友好的聊天界面生成效果,以與流暢的網(wǎng)絡通信效果。生成的聊天室可以達到基本的聊天要求,具有較高的研究價值。系統(tǒng)具有目前聊天室的基本功能:包括支持語氣選擇,支持私聊,可以給所有聊友發(fā)公共信息,具有速度快,高穩(wěn)定性,占用系統(tǒng)資源少,用戶界面友好等特點。通過畢業(yè)設計,發(fā)現(xiàn)自己在理論研究和實際工作能力等方面都得到了提高,受益匪淺,同時在老師的指導和課題組同學的共同幫助下,與時總結研究成果,這些無疑會對我今后的工作和學習帶來很大的幫助。致謝附錄源代碼importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.event.*;import.*;importjava.io.*;/**聊天服務端的主框架類*/publicclassChatServerextendsJFrameimplementsActionListener{ publicstaticintport=8888;//服務端的偵聽端口 ServerSocketserverSocket;//服務端Socket Imageicon;//程序圖標 JComboBoxcombobox;//選擇發(fā)送消息的接受者 JTextAreamessageShow;//服務端的信息顯示 JScrollPanemessageScrollPane;//信息顯示的滾動條 JTextFieldshowStatus;//顯示用戶連接狀態(tài) JLabelsendToLabel,messageLabel; JTextFieldsysMessage;//服務端消息的發(fā)送 JButtonsysMessageButton;//服務端消息的發(fā)送按鈕 UserLinkListuserLinkList;//用戶鏈表 //建立菜單欄 JMenuBarjMenuBar=newJMenuBar(); //建立菜單組 JMenuserviceMenu=newJMenu("服務(V)"); //建立菜單項 JMenuItemportItem=newJMenuItem("端口設置(P)"); JMenuItemstartItem=newJMenuItem("啟動服務(S)"); JMenuItemstopItem=newJMenuItem("停止服務(T)");JMenuItemexitItem=newJMenuItem("退出(X)"); JMenuhelpMenu=newJMenu("幫助(H)"); JMenuItemhelpItem=newJMenuItem("幫助(H)"); //建立工具欄 JToolBartoolBar=newJToolBar(); //建立工具欄中的按鈕組件 JButtonportSet;//啟動服務端偵聽 JButtonstartServer;//啟動服務端偵聽 JButtonstopServer;//關閉服務端偵聽 JButtonexitButton;//退出按鈕 //框架的大小 DimensionfaceSize=newDimension(400,600); ServerListenlistenThread; JPaneldownPanel; GridBagLayoutgirdBag; GridBagConstraintsgirdBagCon; /** *服務端構造函數(shù) */ publicChatServer(){ init();//初始化程序 //添加框架的關閉事件處理 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); //設置框架的大小 this.setSize(faceSize); //設置運行時窗口的位置 DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation((int)(screenSize.width-faceSize.getWidth())/2, (int)(screenSize.height-faceSize.getHeight())/2); this.setResizable(false); this.setTitle("聊天室服務端");//設置標題 //程序圖標 icon=getImage("icon.gif"); this.setIconImage(icon);//設置程序圖標 show(); //為服務菜單欄設置熱鍵'V' serviceMenu.setMnemonic('V'); //為端口設置快捷鍵為ctrl+p portItem.setMnemonic('P'); portItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK)); //為啟動服務快捷鍵為ctrl+s startItem.setMnemonic('S'); startItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK)); //為端口設置快捷鍵為ctrl+T stopItem.setMnemonic('T'); stopItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,InputEvent.CTRL_MASK)); //為退出設置快捷鍵為ctrl+x exitItem.setMnemonic('X'); exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK)); //為幫助菜單欄設置熱鍵'H' helpMenu.setMnemonic('H'); //為幫助設置快捷鍵為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=newJButton("端口設置"); startServer=newJButton("啟動服務"); stopServer=newJButton("停止服務"); exitButton=newJButton("退出"); //將按鈕添加到工具欄 toolBar.add(portSet); toolBar.addSeparator();//添加分隔欄 toolBar.add(startServer); toolBar.add(stopServer); toolBar.addSeparator();//添加分隔欄 toolBar.add(exitButton); contentPane.add(toolBar,BorderLayout.NORTH); //初始時,令停止服務按鈕不可用 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=newJButton(); 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); //關閉程序時的操作 this.addWindowListener( newWindowAdapter(){ publicvoidwindowClosing(WindowEvente){ stopService(); System.exit(0); } } ); } /** *事件處理 */ publicvoidactionPerformed(ActionEvente){ Objectobj=e.getSource(); if(obj==startServer||obj==startItem){//啟動服務端 startService(); } elseif(obj==stopServer||obj==stopItem){//停止服務端 intj=JOptionPane.showConfirmDialog( this,"真的停止服務嗎?","停止服務", JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE); if(j==JOptionPane.YES_OPTION){ stopService(); } } elseif(obj==portSet||obj==portItem){//端口設置 //調出端口設置的對話框 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){//菜單欄中的幫助 //調出幫助對話框 HelphelpDialog=newHelp(this); helpDialog.show(); } elseif(obj==sysMessage||obj==sysMessageButton){//發(fā)送系統(tǒng)消息 sendSystemMessage(); } } /** *啟動服務端 */ publicvoidstartService(){ try{ serverSocket=newServerSocket(port,10); messageShow.append("服務端已經(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(); } /** *關閉服務端 */ publicvoidstopService(){ try{ //向所有人發(fā)送服務器關閉的消息 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("服務端已經(jīng)關閉\n"); combobox.removeAllItems(); combobox.addItem("所有人"); } catch(Exceptione){ //System.out.println(e); } } /** *向所有人發(fā)送服務器關閉的消息 */ publicvoidsendStopToAll(){ intcount=userLinkList.getCount(); inti=0; while(i<count){ Nodenode=userLinkList.findUser(i); if(node==null){ i++; continue; } try{ node.output.writeObject("服務關閉"); 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.isErrorID(0)){ image=null; } returnimage; } publicstaticvoidmain(String[]args){ ChatServerapp=newChatServer(); }}importjava.awt.*;importjavax.swing.border.*;import.*;importjavax.swing.*;importjava.awt.event.*;/***生成設置對話框的類*/publicclassHelpextendsJDialog{ JPaneltitlePanel=newJPanel(); JPanelcontentPanel=newJPanel(); JPanelclosePanel=newJPanel(); JButtonclose=newJButton(); JLabeltitle=newJLabel("聊天室服務端幫助"); JTextAreahelp=newJTextArea(); Colorbg=newColor(255,255,255); publicHelp(JFrameframe){ super(frame,true); try{ jbInit(); } catch(Exceptione){ e.printStackTrace(); } //設置運行位置,使對話框居中 DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation((int)(screenSize.width-400)/2, (int)(screenSize.height-320)/2); this.setResizable(false); } privatevoidjbInit()throwsException{ this.setSize(newDimension(400,200)); this.setTitle("幫助"); titlePanel.setBackground(bg);; contentPanel.setBackground(bg); closePanel.setBackground(bg); help.setText("1、設置服務端的偵聽端口(默認端口為8888)。\n"+ "2、點擊啟動服務按鈕便可在指定的端口啟動服務。\n"+ "3、選擇需要接受消息的用戶,在消息欄中寫入消息,之后便可發(fā)送消息。\n"+ "4、信息狀態(tài)欄中顯示服務器當前的啟動與停止狀態(tài)、"+ "用戶發(fā)送的消息和\n服務器端發(fā)送的系統(tǒng)消息。"); help.setEditable(false); titlePanel.add(newLabel("")); titlePanel.add(title); titlePanel.add(newLabel("")); contentPanel.add(help); closePanel.add(newLabel("")); closePanel.add(close); closePanel.add(newLabel("")); ContainercontentPane=getContentPane(); contentPane.setLayout(newBorderLayout()); contentPane.add(titlePanel,BorderLayout.NORTH); contentPane.add(contentPanel,BorderL

溫馨提示

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

評論

0/150

提交評論