第一篇:JAVA聊天室實驗報告
Java聊天室實驗報告
班 級:學 號:姓 名:
****** ******** ***
目錄:
一、實驗目的.......................................................3
二、所需技術.......................................................3
三、需求分析.......................................................3
四、系統設計.......................................................4
1、服務器結構..................................................4
2、客戶端結構..................................................4
五、實現細節.......................................................5
1、客戶端細節...................................................5
2、服務器細節...................................................6
六、系統展示.......................................................7
七、實驗小結.......................................................9
Rain153 WeChat 聊天室系統一、實驗目的:
1、使用Java技術完成聊天室系統,深入學習使用Java語言。
2、使用Java 的多線程機制,深入理解Java多線程技術的應用。
3、使用GUI,對JFrame的深入學習。
4、使用網絡編程,掌握基于TCP協議的Socket編程,了解Socket編程的協議約定,掌握簡單應用協議的開發。
5、使用C/S架構,對網絡編程有一定的了解。
二、所需技術
本系統要求使用java技術開發。所需知識包括java程序設計語言、swing基本GUI組件、多線程編程、socket編程、集成開發環境使用eclipse。系統采用兩層C/S體系結構,C端負責通過GUI與客戶交互,實現注冊、登陸、收發信息、退出等功能; S端是聊天系統的服務器。
三、需求分析
開發一個類似QQ 的聊天室系統,即WeChat聊天系統。該系統應具有如下功能:
1、2、用戶注冊、登錄 群聊;
3、私聊;
4、服務器發送系統消息;
5、服務器踢人;
6、保存日志;
7、保存聊天信息;
四、系統設計
1、服務器結構
啟動服務器監聽AppServer服務器控制監聽窗體ServerFrameConnection處理所有用戶請求
服務器端結構圖示
2、客戶端結構
啟動客戶端ChatClient用戶登錄窗體Login用戶聊天主窗體ChatRoom時鐘窗體ClockRegister用戶注冊窗體Windowclose用戶窗體監聽器
客戶端結構圖示
1、AppServer.java
為服務器端監聽類,負責服務器的啟動,包括啟動監聽端口、服務器監控界面。
2、ServerFrame.java 為服務器監控窗體,負責監控服務器運行狀態。
3、Connection.java 為服務器連接處理的具體實現。
4、ChatClient.java 為客戶端程序啟動類,負責客戶端的啟動和退出。
5、Login.java 為客戶端程序登錄界面,負責用戶帳號信息的驗證與反饋。
6、Register.java 為客戶端程序注冊界面,負責用戶帳號信息的注冊驗證與反饋。
7、ChatRoom.java 為客戶端程序聊天室主界面,負責接收、發送聊天內容與服務器的Connection合作。
8、Windowclose 為ChatRoom.java的內部類,負責監聽聊天室界面的操作,當用戶退出時返回給服務器信息。
9、Clock.java 為客戶端程序的一個小程序,實現的一個石英鐘功能。(可選)
五、實現細節
概述:聊天室主要功能的實現:從界面輸入登錄信息,然后與服務器建立Socket連接(連接時應指定服務器的IP地址和端口號,而客戶端socket的端口由本方操作系統從空閑端口中確定),服務器端的“傾聽Socket”收到連接請求后,一般會接受連接請求,并生成一個服務端socket,專門負責與此客戶端socket的通信。一旦連接請求成功,客戶端將信息及請求通過本方socket的輸出流發送給服務器端相應的socket,服務端則通過服務器端Socket的輸入流接受客戶端傳輸過來的信息及請求,分析是何請求,然后根據請求類型,進行相應的處理(如登錄、轉發信息等)。服務方也可以根據需要,通過socket的輸出流發信息和請求給客戶端(公告)。客戶方和服務方都可以通過關閉本方的socket而結束一次通訊過程。為了實現多客戶在線的請求,使用多線程機制來處理,對每一個客戶端連接通訊,服務器端都有一個線程專門負責處理。
一)客戶端細節
1、注冊:
當選擇注冊時,Register界面等待用戶輸入注冊信息,并將信息封裝成Register_Customer類,然后通過建立在Socket的連接之上的對象輸出流將用戶注冊信息發送給服務器端,服務器端將請求轉發給Connection處理,Connection 在收到信息后將驗證數據的完整性并在數據庫中查找該用戶名是否已經注冊,然后將注冊信息加入數據庫,最后將注冊結果返回給客戶端。客戶端顯示注冊結果。
2、登錄:
當選擇登錄時,客戶端由Login 界面等待用戶輸入登錄信息后,封裝成Customer對象類然后通過建立在Socket的連接之上的對象輸出流將用戶登錄信息發送給服務器端,服務器端將請求轉發給Connection處理,Connection 在收到信息后將驗證數據的完整性并在對象型數據庫中查找該用戶名是否已經注冊,然后將注冊用戶的信息與登錄請求信息進行密碼驗證,在登錄成功后將該用戶添加到在線用戶列表,最后將登錄結果返回給客戶端。若登錄成功,客戶端將啟動聊天室主界面。
3、聊天 a、發送聊天信息:私聊功能需在在線列表中選中私聊聊天對象,并勾選私聊選項。群聊功能取消對私聊功能的勾選即可。當用戶點擊完發送按鈕后,程序開始將當前用戶名、聊天對象、聊天內容、表情和是否私聊進行封裝,然后獲取Socket連接,再用對象輸出流包裝Socket的輸出流將聊天信息對象發送給服務器端。
b、接收聊天信息:用一個單獨的接收線程實現,客戶端必須隨時接收服務器發來的消息,而讀取消息的方法采用的是阻塞式方法,若在事件處理程序中讀(占用的是事件處理線程)則會使程序在此后無法響應用戶操作,所以需要生成一個單獨的線程專門用于讀取處理消息。而發送消息的方法則是將消息放入操作系統的發送緩沖區后就返回的,所以發送執行的相當快,可以在事件處理線程中直接調用。發送和接收可以同時進行。二)服務器端細節
1、注冊:創建一個File文件類,載入“user.txt”,再用對象輸入流ObjectInputStream包裝File文件類,將存儲在“user.txt”得向量對象Vector中載入內存中,現在系統中的向量就是對象型數據庫,存儲著每條用戶信息對象。判斷是否是第一個注冊用戶,判斷用戶名是否已經存在,判斷用戶名是否為系統關鍵字,用戶名有效后 寫入數據庫,并給客戶端返回信息,關閉Socket連接。
2、登錄:去數據庫讀用戶數據,打開用戶數據庫文件“user.txt”,將用戶數據對象集載入內存,以供下面的程序使用。驗證用戶名是否存在,驗證用戶密碼是否正確,驗證用戶是否已經登錄,驗證是否已經超過最大登錄人數,如果以上驗證全部正確,返回客戶端信息,關閉Socket連接。
3、退出:接收退出信息,當用戶退出時,客戶端將會用基于Socket的對象輸出流發給服務器退出對象,把用戶從在線列表中刪除,更新在線列表。
4、聊天:接收用戶聊天信息,當用戶發送聊天信息時,服務端將會收到客戶端用Socket傳輸過來的聊天信息對象,然后將其轉換為Message對象,返回聊天信息,然后系統從Message中提出消息類型,再根據類型將消息強制轉化ChatMessage,調用ChatMeaage中方法,獲取目的客戶名稱列表,根據目的地用戶名從用戶名、socket鍵值表中獲取socket,再通過socket將Message轉發到相應的用戶。
六、系統展示
1、注冊
客戶端注冊界面
2、登錄
客戶端登錄界面
3、聊天界面
聊天界面
4、服務器界面
服務器管理界面
服務器用戶信息管理界面
七、實驗小結
本次實驗是比較復雜的一個題目,采用C/S架構設計的聊天室,使用增量迭代方式開發,從初始的0.1版到最終的2.0正式版。通過本次實驗,對C/S架構有了較深的認識,也對多線程編程、網絡編程、GUI的認識更清晰。在項目中遇到很多問題,在解決問題的過程中,對Java也漸漸的熟悉,尤其是對各種異常的處理更是對自己的一種鍛煉。在此次實驗中應用了很多上課時未講到的知識,自己查閱API,閱讀JDK源碼學習方法的使用讓自己收獲頗豐。由于這是一個人的項目,雖然在項目的實施上很自由,可到問題沒有人討論,耗費了很多精力,不過這也是提高自己的好方法。
該Rain153 WeChat聊天室由于時間原因,很多功能實現的并不合理,也有些功能尚未實現。Rain153 WeChat并未與數據庫連接,只是簡單的用文件保存用具信息及消息記錄。
第二篇:java聊天室設計總結
JAVA聊天室程序設計總結
大二第一學期末我們進行了為期兩周的java實習,這次的實習內容是設計一個多人聊天室。在網絡越來越發達的今天,人們對網絡的依賴越來越多,越來越離不開網絡,由此而產生的聊天工具越來越多,類似QQ、MSN,網絡聊天時一類的聊天系統的發展日新月異,因此老師布置了制作一個有簡單聊天功能的網絡聊天程序的課程;而且通過制作該程序還能更好的學習網絡軟件編程知識。
一、設計內容
利用java語言實現聊天室程序。聊天室分為服務器端和客戶端兩部分,服務器端程序主要負責偵聽客戶端發來的消息,客戶端需登錄到服務器端才可以實現正常的聊天功能。設計的聊天室能實現用戶登錄,顯示登錄用戶列表,以及發送聊天信息和顯示聊天信息的功能。并可以選擇接收信息的用戶進行單發或群發的功能,運行程序,登錄服務器后,可以從列表中選擇單個或多個用戶進行聊天,它是圖形界面,線程,流與文件系統等技術的綜合應用。
二、實現功能
1、啟動服務器端,接收客戶端發來的信息,并在服務器端窗體顯示客戶端聊天信息,再吧信息返給在線用戶。
2、啟動客戶端,進入客戶端頁面,輸入用戶名,點擊登錄按鈕,在顯示在線用戶列表內顯示用戶名。
3、發送編輯框輸入發送內容,單擊發送按鈕,啟動輸出流,把信息發送出去,同時把發出的信息追加到聊天內容文本域內,顯示用戶名,時間和發送內容。
4、聊天信息文本域,在線用戶顯示域和發送信息的文本域加了滾動條,其中聊天信息文本域,發送信息的文本域的文字能自動換行。
5、別的客戶端發來信息是通過輸入流讀取信息,并截取發來信息的用戶名及信息,用戶名加到在線用戶列表上顯示在線,信息追加到聊天內容文本域內,顯示用戶名,時間和發送內容。
三、設計收獲
這是大學以來第一次自主設計一個聊天程序,于我來說還是很有新鮮感但同時也有著稍許擔心。通過此次課程設計,將我本學期所學的JAVA知識得到鞏固和應用,在設計的過程中我遇到了很到問題,但經過一次又一次的思考,一遍又一遍的檢查和在老師、同學們的幫助下,慢慢的走上了成功之路,同時也暴露出了前期我在這方面的知識欠缺和經驗不足。實踐出真知,通過親自動手制作,使我們掌握的知識不再是紙上談兵。這次課程設計還讓我懂得了寫程序不能閉門造車,要努力拓寬知識面,開闊視野,拓展思維。它還讓我學會了在網上查閱那些無限的資料。讓我不僅學會了書本上的知識,還讓自己能夠面對困難并且克服它使我更加扎實的掌握了有關JAVA方面的知識。過而能改,善莫大焉。在聊天室設計過程中,我們不斷發現錯誤,不斷改正,不斷領悟,不斷獲齲最終的檢測調試環節,本身就是在踐行“過而能改,善莫大焉”的知行觀。程序雖然完成,但是距離優秀仍存在一定差距,用JAVA開發大型項目還有很多我需要去努力學習的知識。希望自己能不斷學習和實踐,爭取以后做得更好。
第三篇:java聊天室課程設計報告
課程設計報告
2011 ~ 2012 學年 第 一 學期
學 號 20104053020 姓 名 胡勇昌 院 系 信息工程與技術 專 業 計算機工程系 課 程 名 稱 JAVA程序設計 課程設計名稱 局域網內的多功能聊天室
學 時 學 分 1 指 導 教 師 許爍娜
2011年 12 月 25 日
目錄
課程設計報告..........................................................................................................................................1 第1章 引言............................................................................................................................................3 1.1 背景...............................................................................................................................................3 1.2 相關技術.......................................................................................................................................3 1.2.1 JAVA概述...............................................................................................................................3 1.2.2 Socket......................................................................................................................................3 1.2.3 TCP 三次握手.....................................................................................................................4 1.3 術語...............................................................................................................................................4 第2章 需求分析與系統設計................................................................................................................5 2.1 需求分析.......................................................................................................................................5 2.2 系統設計.......................................................................................................................................6 2.2.1多用戶在線方案.....................................................................................................................6 2.2.2 系統功能................................................................................................................................6 第3章 系統實施....................................................................................................................................6 3.1聊天室窗口....................................................................................................................................6 3.2 建立客戶端窗口...........................................................................................................................8 3.3 內嵌“私聊”窗口.......................................................................................................................9 3.4客服端類繼承客戶端窗口類,并內嵌私聊程序......................................................................10 第4章 測試..........................................................................................................................................15 4.1 測試環境與使用方法.................................................................................................................15 4.2 功能測試.....................................................................................................................................15 4.2.1聊天室窗口...........................................................................................................................15 4.2.2 客戶端窗口..........................................................................................................................16
4.2.3 內嵌“私聊”窗口..........................................................................................................................16
參考文獻................................................................................................................................................16
第1章 引言
1.1 背景
網絡聊天室通常直稱聊天室,是一種人們可以在線交談的網絡論壇,在同一聊天室的人們通過廣播消息進行實時交談。聊天室可以建立在即時通訊軟件(如MSN Messenger、QQ)、P2P軟件、萬維網(如 Halapo,Meebo)等基礎上,萬維網方式更為普通和種類繁多,交談的手段不局限于文本,更包括語音、視頻。通常聊天室是按照房間或頻道為單位的,在同一房間或頻道的網人可以實時地廣播和閱讀公開消息。一般情況下,與其它網絡論壇、即時通訊不同的是,聊天室不保存聊天記錄。
1.2 相關技術 1.2.1 JAVA概述
Java是一種可以撰寫跨平臺應用軟件的面向對象的程序設計語言,是由Sun Microsystems公司于1995年5月推出的Java程序設計語言和java平臺(即JavaSE, JavaEE, JavaME)的總稱。Java 技術具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應用于個人PC、數據中心、游戲控制臺、科學超級計算機、移動電話和互聯網,同時擁有全球最大的開發者專業社群。在全球云計算和移動互聯網的產業環境下,Java更具備了顯著優勢和廣闊前景。
1.2.2 Socket Socket是java中需一要編寫較低層次的網絡通信程序(例如Cljent/server應用程序)時提供的一種通訊機制。Socket是兩個程序進行雙向數據傳輸的網絡通信的端點,一般 由一個地址加上一個端口號來標一識。每個服務程序都在一個眾所周知的端口上提供服 務,而想使用服務的客戶端程序則需要連接該端口。通過Socket的數據是原始字節流信 息,通信雙方必須根據約定的協議對數據進行處理與解釋。
Socket通信機制提供了兩種通信.方式:有連接方式(TCP)和無連接方式(UDP數
據報)。有連接方式中,通信雙方在開始時必須進行一次連接過程,建立一條通信鏈路。通信鏈路提供了可靠的,全雙工的字節流服務。無連接力一式中,通信雙方不存在一個連 接過程,一次網絡I/O以一個數據報形式進行,而每次網絡I /O可以和不同.主機的不 同進程進行。無連接方式開銷小于有連接方式,但是所提供的數據傳輸服務不可靠,不 能保證數據報一定到達目的地”」·。
JAVA的有連接通信采用流式I/O模式。Socket是兩個進程間通信鏈的端點,每個 Sockct有兩個流:一個輸入流和一個輸出流。只要向Sockct的輸出流寫,一個進程就可 以通過網絡連接向其他進程發送數據;同樣,通過讀Sockt的輸入流,就可以讀取傳輸 來的數據。
有連接通信一般要經歷以下四個基本步驟ii
(1)創建Sockct,建立連接;
(2)打開連接到Sockct的輸入/輸出流;
(3)按照一定的一腳議對Socket進行讀/寫操作;
(4)關閉Socket。
第(3)步是程序員用來調用Socket和實現程序功能的關鍵步驟,其他三步在各種 程序中基本相同。
1.2.3 TCP 三次握手
TCP協議通過三個報文段完成連接的建立,這個過程稱為三次握手(three-way handshake),過程如下圖所示。
1.3 術語
暫無
第2章 需求分析與系統設計
2.1 需求分析
從技術發面來看,Java語言的優點一要表現在:簡.單、面向對象、多線程、安全性 等方面。1.簡單性
Java與C++語言灰常相近,但Java比C++簡單,它拋棄了C++中的一些不是絕對 必要的功能,如頭文件、頂處理文件、指針、結構、運算符重載、多重繼承以及自動強迫同型。Java實現了自動的垃圾收集,簡化了內存管理的一作。這使程序一設計更加簡便,同時減少了出錯的可能。2.面向對象
Java提供了簡單的類機制和動態的構架模型。對象中封裝了它的狀態變量和方法,很好地實現了模塊化和信息隱藏;而類則提供了一類對象的原型,通過繼承和重載機制,子類可以使用或重新定義父類或超類所提供的一方法,從而既實現了代碼的復用,又提供了一種動態的解決方案。
Java是一種完全面向對象的程序設計語一言,它除了數組、布爾和字符二個基本數據類型外的其它類都是對象,它不再支持全局變量。在Java中,如果不創建新類就無法創建程序,Java程序在運行時必須先創建一個類的實例,然后才能提交運行。
Java同樣支持繼承特性,Java的類可以從其它類中繼承行為,但Java只支持類的 單重繼承,即每個類只能從一個類中繼承。
Java支持界面,界面允許程序員定義方法但又不立即實現,一個類可以實現多個界面,利用界面可以得到多重繼承的許多優點而又沒有多重繼承的問題。3.多線程
多線程使應用程序可以同時進行不同的操作,處理不同的事件。在多線程機制中,不同的線程處理不同的任務,他們之間互不干涉,不會由于一處等待影響其他部分,這樣容.易實現網絡上的實時交互操作。
Java程序可以有多個執行線程,如可以讓一個線程進行復雜的計算,而讓另一個線 程與用戶進行交互,這樣用戶可以在不中斷計算線程的前提下與系統進行交互。多線程保證了較高的執行效率。4.安全性
Java不支持指針,一切對內存的訪問都必須通過對象的實例變量來實現,這樣就防止了程序員使用欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產生的錯誤。2.2 系統設計 2.2.1多用戶在線方案 2.2.2 系統功能
聊天室程序通常需要完成以下一些基本功能:
(I)登錄聊天室;
(2)啟動服務器;
(3)關閉服務器;
(4)用戶之間的聊天;
(5)退出聊天室。
本系統其體功能需求如下:
(1)聊天室管理員經登錄界面登錄到管理界而,即系統的服務器端。用戶經登錄界而 都進入聊天大廳。
(2)不論是管理員還是用戶都需一要在登錄界面輸入正確的用戶名和密碼后才可以登錄 到各自的界面中去。
(3)系統的兩個主要界面都是為方便管理員和用戶操作的。首先,管理員進入到管理 界而后可以方便的啟動/停止服務器,看到在線用戶的信息和聊人信息、。用戶進入到聊天 大廳中可以聊天,查看服務器狀態。
(4)一個用戶退出聊天室對其他用戶不能產生影響,而服務器斷開與客戶端的連接則所有的用戶都失去與服務器的連接。
(5)用戶的聊天信息錄入,重寫,發送,接收方便,快捷。
(6)服務器狀態,聊天信息和在線用戶人數及時刷新。
(7)聊天室系統運行穩定、安全性高、性能可靠。
第3章 系統實施
3.1聊天室窗口
建立服務端窗口類:窗口程序如下 import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.List;import java.awt.TextArea;
import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;import javax.swing.JTextField;
public class chatroomW { JFrame f=new JFrame(“局域網聊天室”);JLabel label1=new JLabel(“端口”);JLabel label2=new JLabel(“發送”);Button button1=new Button(“啟動服務”);Button button2=new Button(“發送”);Button button3=new Button(“刷新用戶列表”);JTextField text1=new JTextField(5);JTextField text2=new JTextField(25);TextArea area1=new TextArea(26,84);List userList=new List(27);JScrollPane scro1,scro2;public chatroomW(){
chat();} public void chat(){
area1.setBackground(new Color(204,255,255));
area1.setForeground(Color.black);
userList.setBackground(Color.gray);
userList.setForeground(Color.white);
f.setLayout(new FlowLayout());f.add(area1);f.add(userList);f.add(label1);f.add(text1);f.add(button1);f.add(text2);f.add(button2);f.add(button3);
f.setBounds(300,200,750,485);
f.setResizable(false);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
area1.setEditable(false);text1.setText(“10000”);
myEvent();
} public static void main(String args[]){
new chatroomW();} public void myEvent(){} }
3.2 建立客戶端窗口
import java.awt.Color;import java.awt.FlowLayout;import java.awt.TextArea;
import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;import javax.swing.JTextField;
public class ClientW {
JFrame f=new JFrame(“聊天室”);JScrollPane js;TextArea area=new TextArea(19,67);JTextField text1=new JTextField(12);JTextField text2=new JTextField(5);JTextField text3=new JTextField(5);JTextField text4=new JTextField(20);JButton button1=new JButton(“連接”);JButton button2=new JButton(“發送”);JButton button3=new JButton(“私聊”);JLabel label1=new JLabel(“服務器地址”);JLabel label2=new JLabel(“服務器端口”);JLabel label3=new JLabel(“昵稱”);public ClientW(){ } public void chat(){
area.setBackground(new Color(204,255,255));area.setForeground(Color.black);f.setLayout(new FlowLayout());f.setBounds(300,200,500,410);f.add(label1);f.add(text1);f.add(label2);chat();//
}
} f.add(text2);f.add(button1);f.add(area);f.add(label3);f.add(text3);f.add(text4);f.add(button2);f.add(button3);f.setVisible(true);f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setResizable(false);area.setEditable(false);text2.setText(“10000”);text4.setText(null);myEvent();public void myEvent(){} public static void main(String args[]){ } new ClientW();
3.3 內嵌“私聊”窗口
class netchat{ JFrame f=new JFrame(“私聊”);JLabel label1,label2,label3;Button button1,button2;JTextField text1,text2,text3,text4;TextArea textarea;
f.setLayout(new FlowLayout());f.setBounds(300,200,400,310);//設置窗口大小和位置; label1=new JLabel(“對方主機”);label2=new JLabel(“本地端口”);label3=new JLabel(“對方端口”);button1=new Button(“連接”);button2=new Button(“發送”);text1=new JTextField(7);text2=new JTextField(3);text3=new JTextField(3);public netchat(){ f.setResizable(false);//讓窗口大小固定;
// 閉;
} text4=new JTextField(20);textarea=new TextArea(13,53);textarea.setEditable(false);textarea.setBackground(new Color(204,250,255));f.add(label1);f.add(text1);f.add(label2);f.add(text2);f.add(label3);f.add(text3);f.add(button1);f.add(textarea);f.add(text4);f.add(button2);f.setVisible(true);f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);//關閉窗口程序同時關myEvent();
3.4客服端類繼承客戶端窗口類,并內嵌私聊程序
import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.TextArea;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.Socket;
import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTextField;
public class Client extends ClientW{ Socket s=null;public Client(){} public void myEvent(){
button1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
s=new Socket(text1.getText().toString(),Integer.parseInt(text2.getText()));
new Thread(new LinkC()).start();
area.append(“[系統消息]:連接成功n”);
}catch(Exception ex){area.append(“[系統消息]:連接失敗n”);}
}
});
button2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new SentC();
}
});
button3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new netchat();
}
});} public static void main(String args[]){
new Client();}
class LinkC implements Runnable{
public void run(){
try{
BufferedReader bufIn=
new BufferedReader(new InputStreamReader(s.getInputStream()));
String msg=null;
PrintStream ps=new PrintStream(s.getOutputStream());
ps.println(text3.getText());
while(true){
try{
while((msg=bufIn.readLine())!=null){
area.append(msg+“n”);
}
}catch(Exception ex){break;}
}
}catch(Exception e){}
}
}
class SentC {
public SentC(){
try{
PrintStream ps=new PrintStream(s.getOutputStream());
if(!text4.getText().equals(“")){
ps.println(text4.getText());//
area.append(text4.getText());//服務器自動會返回
text4.setText(”“);
}
}catch(Exception e){}
}
} //私聊類
class netchat{
JFrame f=new JFrame(”私聊“);
JLabel label1,label2,label3;
Button button1,button2;
JTextField text1,text2,text3,text4;
TextArea textarea;
public netchat(){
f.setLayout(new FlowLayout());
f.setBounds(300,200,400,310);
//設置窗口大小和位置;
f.setResizable(false);
//讓窗口大小固定;
label1=new JLabel(”對方主機“);
label2=new JLabel(”本地端口“);
label3=new JLabel(”對方端口“);
button1=new Button(”連接“);
button2=new Button(”發送“);
text1=new JTextField(7);
text2=new JTextField(3);
text3=new JTextField(3);
text4=new JTextField(20);
textarea=new TextArea(13,53);
textarea.setEditable(false);
textarea.setBackground(new Color(204,250,255));
text2.setText(”10000“);
text3.setText(”10000“);
f.add(label1);
f.add(text1);
f.add(label2);
f.add(text2);
f.add(label3);
f.add(text3);
f.add(button1);
f.add(textarea);
f.add(text4);
f.add(button2);
f.setVisible(true);//
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);//關閉窗口程序同時關閉;
myEvent();
}
public void myEvent(){
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e){
try{
DatagramSocket ds=new DatagramSocket();
byte[] buf=”對方已下線“.getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName(text1.getText()),Integer.parseInt(text3.getText()));
ds.send(dp);
ds.close();
}catch(Exception ex){}
}
});
button2.addActionListener(new ActionListener()//事件源是button2
{
public void actionPerformed(ActionEvent e)
{
if(!text4.getText().equals(”“))
new Thread(new Send()).start();
}
});
button1.addActionListener(new ActionListener()//事件源是button1
{
public void actionPerformed(ActionEvent e)
{
new Thread(new Rece()).start();
}
});
}
class Send implements Runnable{
public void run(){ try{UdpSend();}catch(Exception e){textarea.append(”[系統消息]:發送失敗n“);}}
public void UdpSend()throws Exception{
DatagramSocket ds=new DatagramSocket();
byte[] buf=text4.getText().getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName(text1.getText()),Integer.parseInt(text3.getText()));
textarea.append(”[我]: “+text4.getText()+”n“);
text4.setText(”“);
ds.send(dp);
ds.close();
}
}
class Rece implements Runnable{
int index=0;
public void run(){
try{
UdpRece();
}catch(Exception e){
textarea.append(”[系統消息]:連接失敗n“);
}
}
public void UdpRece()throws Exception{
while(true){
DatagramSocket ds=new DatagramSocket(Integer.parseInt(text2.getText()));
if(index==0){textarea.append(”[系統消息]:連接成功n“);}
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
String data=new String(dp.getData(),0,dp.getLength());
textarea.append(dp.getAddress()+” “+data+”n");
index++;
ds.close();
}
}
}
} } 第4章 測試
4.1 測試環境與使用方法
測試環境:測試環境:電腦安裝Java JDK 服務器端使用方法:打開服務啟動,點擊“啟動服務”,提示“啟動服務成功”表示正常啟動。否則,先關閉服務端,再重新打開,啟動服務。客戶端使用方法:打開客戶端,輸入“服務器地址”,點擊“連接”,如成功連接系統提示“成功連接”,并收到服務端返回的“歡迎”信息,否則關閉并重新啟動。
私聊功能使用方法:點擊面板上的“私聊”按鈕,輸入對方的IP地址,點擊連接,如連接成功系統會提示“連接成功”。當對方斷開時會收到“對方已下線”提示。如果要同時跟多人私聊,則要改變本地端口值,并告知對方。
4.2 功能測試 4.2.1聊天室窗口
4.2.2 客戶端窗口
4.2.3 內嵌“私聊”窗口
參考文獻
用JAVA程序實現參考文獻的錄入與生成 劉瑋瑋 2009 《福建電腦》
基于Java移動Agent系統的安全參考模型 周屹 2007 《黑龍江工程學院學報》
嵌入式Java虛擬機的性能優化技術 李允 2004 《計算機工程》
第四篇:java局域聊天室實踐總結
河北科技師范學院
JAVA程序設計課程設計
個人實習總結
實習類型 課程設計 實習單位 指導教師 所在院(系)信息技術系 班 級 姓 名 學
號
_
一、實習時間和地點
時間:2015.3.17-2015.4.14 地點:F310、F311
二、實習的內容
我所開發的系統是:局域網聊天系統。系統功能簡要說明如下:
該程序實現局域網內的聊天功能,包括服務器端程序和客戶端程序兩部分。
1、服務器:負責處理各個客戶端的信息,并負責將信息進行轉發。①服務器主要負責響應客戶端的的各種信息,包括鏈接服務器,用戶信息發送,各個客戶端的信息相互轉發。②服務器的實現有Server類,Server類主要是進行初始化的工作
2、客戶端:用戶使用界面,負責接受信息以及與服務器進行通信。①客戶端負責為用戶提供聊天界面,將信息發送至服務器,接受服務器的反饋信息等一系列的工作。②客戶端的實現有Client類,Client類負責與服務器,其它客戶端進行通信。
1.連接:點擊“連接”按鈕之后將信息發送到服務器端,服務器端創建相應的連接,并將更新后的用戶列表發送給所有用戶。2.發送:根據發送者、發送對象、發送的話創建一個字段發送到服務器端。3.清空:清空客戶端接收信息聊天對話框。4.私聊TA:選擇在線主機ip,根據ip地址發送一個私密聊天請求到服務器,服務器選擇相
應的地址進行信息發送。本程序可以有多個用戶,只需在一臺服務器上運行服務端程序,所有的用戶連接上了之后就可以正常通信。
人們日常生活中越來越多地使用聊天室這項應用來為自己的工作和學習服務。一個操作簡單,界面友好、運行穩定的聊天室對于小型局域網的用戶可以起到很好的交流作用。所謂聊天室就是一個可以讓許多用戶同時互相通信的網上園地,個人用戶可以通過聊天室將自己融入整個主流社會中。因此我們這個聊天室選擇了簡潔的界面搭建。因為之前學過JFrame類的使用,所以界面搭建部分代碼如下:
public class TCPClient extends JFrame {
public static String olip;private static final long serialVersionUID = 1L;JTextArea jtaContent = new JTextArea();JTextField jtaInstant = new JTextField();JButton jbSend = new JButton(“發送”);JButton jbConnect = new JButton(“連接”);JButton jbClear = new JButton(“清空”);JLabel jlTip=new JLabel(“在線主機”);JButton jbPChat=new JButton(“私聊TA”);JPanel jpBtns = new JPanel();JPanel jpContact=new JPanel();jtaContent.setEditable(false);jpBtns.setLayout(new GridLayout(1, 3, 5, 5));jpBtns.add(jbConnect);jpBtns.add(jbSend);jpBtns.add(jbClear);jpBtns.setBounds(0, 375, 350, 30);JScrollPane jspText=new JScrollPane(jtaInstant);jspText.setBounds(0, 310, 350, 65);JScrollPane jspContactOL=new JScrollPane(jcbContact);JScrollPane jspContent=new JScrollPane(jtaContent);jspContent.setBounds(0, 0, 350, 300);jpContact.setLayout(new GridLayout(5, 5, 1, 3));jpContact.add(jlTip);jpContact.add(jspContactOL);jpContact.add(jbPChat);jpContact.setBounds(350, 0, 135, 220);public void launchFrame(){
add(jpContact);add(jpBtns);add(jspText);add(jspContent);setLayout(null);setSize(500, 450);setLocation(100, 100);setTitle(“Chat Client”);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);由于本人學習的java不是特別扎實,所以界面的設計代碼經過參考反復實驗才達到要求。界面完成后才發現真正的挑戰剛剛開始。我們需要得到本機ip地址并傳送至服務器,部分代碼如下:
InetAddress
myIP;myIP=InetAddress.getLocalHost();s = new Socket(myIP.getHostAddress(), 9402);然后我們發送IP地址,其他客戶端收到此地址時會判別,判別為IP地址,其它客戶端會將這一IP地址規劃為在線用戶:
InetAddressmyIP;myIP=InetAddress.getLocalHost();strIP=myIP.getHostAddress();dos.writeUTF(“a”+strIP);我們還設計了一個私聊功能,所以就需要實現事件的監聽: Timer tm1=newTimer(1000,newActionListener(){ @Override public voidactionPerformed(ActionEvent e){ tm3.stop();jbPChat.setText(“通知”);tm2.start();}});Timer tm2=new Timer(1000, new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ tm1.stop();jbPChat.setText(“有私聊消息”);tm3.start();}});
Timer tm3=new Timer(1000, new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ tm2.stop();jbPChat.setText(“請查收”);tm1.start();}});這樣,當有私聊信息請求傳送過來時通過這些提醒就可以實現私聊功能。起初我們有這些功能的想法,覺得通過網絡書籍能夠很方便的查找到。可是實際操作實驗中遇到了不少困難。比如這個私聊功能的實現。剛開始連接成功后選擇私聊對象,我們決定以IP地址為依據。加入選擇IP地址功能后點擊私聊,發現客戶端可以收到私聊提示,可是卻收不到具體的文字信息。為此我們查找了大量信息,終于成功的實現了私聊功能。
后來我想,能不能讓服務器端連接數據庫。在客戶端設置一個注冊界面,讓用戶更具體化,這樣識別身份時就不用再使用IP地址。客戶端用戶的注冊信息會保存在數據庫里,下次登錄客戶端就用屬于個人的ID和密碼。首先要實現用戶的注冊:
public void register(){ String strServerIp = txtHost.getText();String strServerPort=txtPort.getText();this.dispose();new Register(strServerIp,strServerPort);然后向服務器端發送“注冊”的命令。服務器處理接收到的命令為“注冊”時調用函數,合法注冊后,向客戶端發送“注冊成功”的消息,并斷開連接。由于時間關系,數據庫未能完成,希望下次有機會可以完善。
三、心得體會
1.成績與收獲
這次軟件開發讓我學到了很多知識。只是只有轉變成實際而有用的東西才能顯現出它的價值。學習不只是學習理論只是,更重要的是自己的動手操作能力。這個軟件工程的項目實戰讓我真切感受到軟件開發的全過程,這讓我明白軟件的開發是一門藝術,而不是代碼的簡單疊加。這需要一個小組的共同努力。這次開發讓我跟深入的去思考了一個軟件的構成與實現。以前用通訊軟件是從未思考過如何實現它的功能,等自己來做是才發現里面要考慮的東西很多。在實踐中,我也學到了很多java編程方面的知識。2.問題與不足
由于java編程運用的不是特別熟練,加上時間問題,我們的程序還有很多不盡
如人意的地方。例如:很多功能沒有實現(語音視頻,文件傳輸,個人信息等等),并且界面比較粗糙。這些都是以后需要努力的地方。水平所限,致使程序實現的功能在方法上也許不是很完美,但我以后會多向老師請教,自己也要加強對java的學習。努力進一步提高自己的編程水平。
第五篇:JAVA課程設計之簡單聊天室
課程設計報告
課程名稱 課程代碼 題
目 年級/專業/班 學生姓名 學
號 指導老師 開題時間 完成時間 Java程序設計
簡單聊天室
孟青 09308910203
I
: : : : : : : : :
目
錄
摘要..............................................................................................................................................................I 1 引言...........................................................................................................................................................1 2 設計任務與目的.......................................................................................................................................1 3 需求分析...................................................................................................................................................1 3.1 系統用例圖............................................................................................................................1 3.2 主要用例分析........................................................................................................................2 4 系統設計.................................................................................................................................................3 4.1 總體設計........................................................................................................................................3 4.1.1 系統類圖.............................................................................................................................3 4.1.2 主要時序圖.........................................................................................................................6 4.2 詳細設計........................................................................................................................................8 4.2.1 ChatServer類......................................................................................................................9 4.2.2 ServerListen類..................................................................................................................10 4.2.3 ServerReceive類...............................................................................................................10 4.2.4 PortConf類.......................................................................................................................11 4.2.5 Help類..............................................................................................................................11 4.2.6 UserLinkList類.................................................................................................................11 4.2.7 Node類.............................................................................................................................12 4.2.8 ChatClient類.....................................................................................................................13 4.2.9 ConnectConf類.................................................................................................................15 4.2.10 UserConf類....................................................................................................................15 4.2.11 Help類............................................................................................................................16 4.2.12 ClientReceive類.............................................................................................................16 5 系統實現.................................................................................................................................................16 5.1 系統主要用例的實現..................................................................................................................16 5.1.1 聊天室服務端用例運行效果...........................................................................................17 5.1.2 聊天室客戶端用例運行效果...........................................................................................18 5.2 系統發布與運行..........................................................................................................................18 5.2.1 系統打包...........................................................................................................................18 5.2.2 系統發布與運行...............................................................................................................18 6 結束語.....................................................................................................................................................19 參考文獻.......................................................................................................................................................19 致謝...............................................................................................................................................................19 附錄A:系統源程序...................................................................................................................................20
1、ChatServer類..........................................................................................................................20
2、ServerListen類.......................................................................................................................31
3、ServerReceive類.....................................................................................................................32
4、UserLinkList類.......................................................................................................................36
5、Node類...................................................................................................................................39
I
6、PortConf類.............................................................................................................................40
7、Help類....................................................................................................................................42
8、ChatClient類...........................................................................................................................44
9、ClientReceive類.....................................................................................................................56
10、ConnectConf類.....................................................................................................................58
11、UserConf類...........................................................................................................................61
12、Help類..................................................................................................................................63 附錄B:編碼規范.......................................................................................................................................66
II
摘要
本課程設計我們通過聊天室的代碼實現,體會到將理論知識與具體實現相結合,鞏固Java相關方法。聊天室共分為服務器端和客戶端兩部分,服務器端程序主要負責偵聽客戶端發來的消息,客戶端需登陸到服務器才可以實現正常的聊天功能。本聊天系統以聊天交流為主,為廣大用戶提供一個借助網絡進行人際交往的平臺,也是網絡與現實最貼近的實用型網站。
關鍵詞:(3-5個,每個之間用分號隔開)聊天室;多線程;C/S模式
Abstract
The course design our chat room through the code, understand the theoretical knowledge and practical realization of the combination, the consolidation of java-related methods.Chat client and the server is divided into two parts, the client, server-side program is mainly responsible for listening client sent the news to be landing the client to the server will be realized only if the normal chat.The chat system to exchange-based chat, in order to provide customers with a network platform for interpersonal communication, but also network with the reality of the practical is the closest site.Key words: Chat rooms, multi-threaded, C / S mode I
簡單聊天室 引言
隨著互聯網逐步普及,人們的生活和工作也越來越離不開信息網絡的支持,而聊天室是人們最常見,最直接的網上交流的方式。本聊天系統以聊天交流為主,為廣大用戶提供一個借助網絡進行人際交往的平臺,也是網絡與現實最貼近的實用型網站。本文所介紹的網絡聊天系統是基于開放的JAVA應用程序開發設計的,其主要特性是能動態、實時的完成信息的傳遞,且具有高效的交互性,更有效的處理客戶請求,且具有脫離數據庫技術方法,易于維護和更新的特點。設計任務與目的
本聊天室程序基于C/S模式,聊天室共分為服務器端和客戶端兩部分,服務器端程序主要負責偵聽客戶端發來的消息,客戶端需登陸到服務器才可以實現正常的聊天功能。
通過本項目的設計實踐,力求熟練掌握GUI程序設計、多線程技術、基于TCP的Socket通信編程。需求分析
本系統所要實現的主要功能是為廣大用戶提供一個借助網絡進行人際交往的平臺。因為服務端采用多線程,所以性能有很大提升。因為服務端和客戶端之間采用TCP協議進行網絡通信,建立的是可靠的、端到端的網絡連接,所以可靠性和安全性都很好。
3.1 系統用例圖
圖3-1 系統用例圖
3.2 主要用例分析 服務器端的主要功能如下:
1,在特定端口上進行偵聽,等待客戶端連接
2,用戶可以配置服務端的偵聽端口,默認端口為8888.3,向已經連接到服務端的用戶發送系統消息。4,統計在線人數
5,當停止服務時,斷開所有的用戶連接。客戶端的主要功能如下:
1,連接到已經開啟的聊天服務的服務端。
2,用戶可以配置要連接服務器端的IP地址和端口號。3,用戶可以配置連接后顯示的用戶名。
4,當服務器端開啟的時候,用戶可以隨時登錄和注銷。5,用戶可以向所有人或者某一個人發送消息。
系統設計 4.1 總體設計
4.1.1 系統類圖
圖4-1-1 服務端系統類圖
圖4-1-2 客戶端系統類圖
4.1.2 主要時序圖
圖4-2-1 服務端主要時序類圖
圖4-2-2 客戶端主要時序類圖
4.2 詳細設計
聊天室服務器端的設計
聊天室服務端主要包括7個類,放在server包中:
4.2.1 ChatServer類
圖4-3 ChatServer類圖
ChatServer.java 包含名為ChatServer的public類,其主要功能為定義服務器端的界面,添加時間
監聽與時間處理。調用ServerListen類來實現服務端用戶上線與下線的監聽,調用ServerListen來實現服務器端的消息收發。
4.2.2 ServerListen類
圖4-4 ServerListen類圖
ServerListen.java 該類實現服務器用戶上線與下線的監聽。該類對用戶上線下線的監聽是通過調用用戶鏈表類(UserLinkList)來實現的。當用戶上線與下線情況發生變化時,該類會對主類的界面進行相應的修改。
4.2.3 ServerReceive類
圖4-5 ServerReceive類圖
ServerReceive.java 該類是實現服務器消息收發的類,該類分別定義了向某用戶及所有人發送消息的方法,發送的消息會顯示在主界面類的街面上。
4.2.4 PortConf類
圖4-6 PortConf類圖
PortConf.java
該類繼承自Jdialog,是用戶對服務器端監聽端口進行修改配置的類。
4.2.5 Help類
圖4-7 Help類圖
Help.java
服務端程序幫助類。
4.2.6 UserLinkList類
圖4-8 UserLinkList類圖
UserLinkList.java
用戶鏈表節點的具體實現類。該類通過構造函數構造用戶鏈表,定義了添加用戶、刪除用戶、返回用戶數、根據用戶名查找用戶、根據索引查找用戶這5個方法。
4.2.7 Node類
圖4-9 Node類圖
Node.java 用戶鏈表的節點類,定義了鏈表中的用戶。該類與前面所講的鏈表節點Node類的功能相當。聊天室客戶端設計
聊天室客戶端主要包括5個類,放在client包中:
4.2.8 ChatClient類
圖4-10 ChatClient類圖
ChatClient.java 包含名為ChatClient的public類,其主要功能為定義客戶端的界面,添加時間監聽與事件處理。該類定義了Connect()與DisConnect()方法實現與客戶端的連接與斷開連接。當登陸到指定的服務器時,調用ClientReceive類實現消息收發,同時該類還定義了SendMessaga()方法來其他用戶發送帶有表情的消息或悄悄話。
4.2.9 ConnectConf類
圖4-11 ConnectConf類圖
ConnectConf.java 該類繼承自Jdialog,是用戶對所有要連接的服務器IP及監聽端口進行修改配置的類。
4.2.10 UserConf類
圖4-12 UserConf類圖
UserConf.java
該類繼承自Jdialog,是用戶對鏈接到服務器時所顯示的用戶名進行修改配置的類。
4.2.11 Help類
圖4-13 Help類圖
Help.java 客戶端程序的幫助類。
4.2.12 ClientReceive類
圖4-14 ClientReceive類圖
ClientReceive.java 該類是實現服務器端與客戶端消息收發的類。系統實現
5.1 系統主要用例的實現
5.1.1 聊天室服務端用例運行效果
圖5-1 聊天室服務端用例運行效果圖
5.1.2 聊天室客戶端用例運行效果
圖5-2 聊天室客戶端用例運行效果圖
5.2 系統發布與運行
5.2.1 系統打包
使用MyEclipse自帶的打包工具分別將server包和client包中的.class文件打成兩個Jar包:ChatServer.jar和CharClient.jar。
5.2.2 系統發布與運行
將server包和client包中的.class文件打成兩個Jar包,就可以發布系統了。直接分別雙擊兩個Jar包(ChatServer.jar和CharClient.jar),就可以運行服務端和客戶端了。
結束語
Java面向對象程序設計是一門應用廣泛并且實用性極強的高級程序設計語言。通過本次課程設計,我們對面向對象的基本思想有了進一步的理解,對項目的各個階段的任務也有了一定的了解。設計開始階段必須明確設計的目的與需求分析,總體設計要全面分析聊天室系統的架構。通過這次設計,使我們認識到體系的架構是最重要的,只有準確的系統設計、很好的定義各個模塊及模塊之間的關系,才能在編碼階段更輕松的的實現。
通過這次課程設計,對我們的邏輯思維能力是一個很大的鍛煉,它不僅加強了我們的系統思考問題的能力,而且還改變了我們以前不好的編程習慣,雖然花費了不少的時間,但是我們學到了豐富的知識。
另外,此次課程設計也提高了我們的團對合作精神,讓我們明白不是不能一個人能單獨完成,而是要集思廣益,結合更多的人的創意思維。讓我們大家深刻的體會到理論與實際相結合的重要性與微妙之處。對于不同的想法我們都會集中討論并對好的意見加以借鑒,在這個討論的過程中,還更正了不少我們各自自身對于某個知識點的誤區。
這次程序設計也是一個毅力的考驗過程。有時候往往只是一個小小的錯誤,卻要花出幾小時甚至是一兩天的時間才可能發現它。所以在這個過程不能過于急躁,要很有耐心將程序反復調試,參考文獻
[1] 張廣彬,孟紅蕊,張永寶.Java課程設計案例精編[M].北京:清華大學出版社,2007,1.[2] 黃曉東.Java課程設計案例精編[M].北京:中國水利水電出版社,2004,5.[3] 求是科技.Java信息管理系統開發實例導航[M].北京:人民郵電出版社,2005,4.[4] 求是科技.Java數據庫系統開發實例導航[M].北京:人民郵電出版社,2004,9.[5]廖衛東Java程序設計實用指南[M].北京:機械工業出版社,2002.1[3] [6]李衛華,傅曉東.Java語言基礎及其應用[M]北京:中國水利水電出版社,1996[5]
致謝
本次課程由上海杰普公司三為指導老師以及我們任課老師郭老師精心輔導,讓我們大家深刻的體會到理論與實際相結合的重要性與微妙之處。使我們對java有了更深刻的認識,產生濃厚的學習興趣。我們由衷對他們表示感謝。
附錄A:系統源程序
1、ChatServer類
功能:為定義服務器端的界面,添加時間監聽與時間處理。調用ServerListen類來實現服務端用戶上線與下線的監聽,調用ServerListen來實現服務器端的消息收發。代碼:
package server;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.net.*;/* * 聊天服務端的主框架類 */ public class ChatServer extends JFrame implements ActionListener{
/** * */ private static final long serialVersionUID = 1L;
public static int port = 8888;//服務端的偵聽端口
ServerSocket serverSocket;//服務端Socket JComboBox combobox;//選擇發送消息的接受者
JTextArea messageShow;//服務端的信息顯示
JScrollPane messageScrollPane;//信息顯示的滾動條
JTextField showStatus;//顯示用戶連接狀態
JLabel sendToLabel,messageLabel;JTextField sysMessage;//服務端消息的發送
JButton sysMessageButton;//服務端消息的發送按鈕
UserLinkList userLinkList;//用戶鏈表
//建立菜單欄
JMenuBar jMenuBar = new JMenuBar();//建立菜單組
JMenu serviceMenu = new JMenu(“服務(V)”);//建立菜單項
JMenuItem portItem = new JMenuItem(“端口設置(P)”);JMenuItem startItem = new JMenuItem(“啟動服務(S)”);
JMenuItem stopItem=new JMenuItem(“停止服務(T)”);JMenuItem exitItem=new JMenuItem(“退出(X)”);
JMenu helpMenu=new JMenu(“幫助(H)”);JMenuItem helpItem=new JMenuItem(“幫助(H)”);//建立工具欄
JToolBar toolBar = new JToolBar();//建立工具欄中的按鈕組件
JButton portSet;//啟動服務端偵聽 JButton startServer;//啟動服務端偵聽 JButton stopServer;//關閉服務端偵聽 JButton exitButton;//退出按鈕
//框架的大小
Dimension faceSize = new Dimension(400, 600);
ServerListen listenThread;JPanel downPanel;GridBagLayout girdBag;GridBagConstraints girdBagCon;/** * 服務端構造函數 */ public ChatServer(){ init();//初始化程序
//添加框架的關閉事件處理
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.pack();//設置框架的大小
this.setSize(faceSize);//設置運行時窗口的位置
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)(screenSize.widthfaceSize.getHeight())/ 2);this.setResizable(false);this.setTitle(“聊天室服務端”);//設置標題
setVisible(true);
//為服務菜單欄設置熱鍵'V'
serviceMenu.setMnemonic('V');
//為端口設置快捷鍵為ctrl+p
portItem.setMnemonic('P');
portItem.setAccelerator(KeyEvent.VK_P,InputEvent.CTRL_MASK));
//為啟動服務快捷鍵為ctrl+s
startItem.setMnemonic('S');
startItem.setAccelerator(KeyEvent.VK_S,InputEvent.CTRL_MASK));
//為端口設置快捷鍵為ctrl+T
stopItem.setMnemonic('T');
stopItem.setAccelerator(KeyEvent.VK_T,InputEvent.CTRL_MASK));
//為退出設置快捷鍵為ctrl+x
exitItem.setMnemonic('X');
exitItem.setAccelerator(KeyEvent.VK_X,InputEvent.CTRL_MASK));
//為幫助菜單欄設置熱鍵'H'
helpMenu.setMnemonic('H');
//為幫助設置快捷鍵為ctrl+p
helpItem.setMnemonic('H');
helpItem.setAccelerator(KeyEvent.VK_H,InputEvent.CTRL_MASK));
}
/** * 程序初始化函數
*/ public void init(){
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
//添加菜單欄
serviceMenu.add(portItem);serviceMenu.add(startItem);serviceMenu.add(stopItem);serviceMenu.add(exitItem);jMenuBar.add(serviceMenu);helpMenu.add(helpItem);jMenuBar.add(helpMenu);setJMenuBar(jMenuBar);//初始化按鈕
portSet = new JButton(“端口設置”);startServer = new JButton(“啟動服務”);stopServer = new JButton(“停止服務”);exitButton = new JButton(“退出”);//將按鈕添加到工具欄 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);//為菜單欄添加事件監聽
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 = new JComboBox();combobox.insertItemAt(“所有人”,0);combobox.setSelectedIndex(0);23
messageShow = new JTextArea();messageShow.setEditable(false);//添加滾動條
messageScrollPane = new JScrollPane(messageShow, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);messageScrollPane.setPreferredSize(new Dimension(400,400));messageScrollPane.revalidate();
showStatus = new JTextField(35);showStatus.setEditable(false);
sysMessage = new JTextField(24);sysMessage.setEnabled(false);sysMessageButton = new JButton();sysMessageButton.setText(“發送”);//添加系統消息的事件偵聽
sysMessage.addActionListener(this);sysMessageButton.addActionListener(this);sendToLabel = new JLabel(“發送至:”);messageLabel = new JLabel(“發送消息:”);downPanel = new JPanel();girdBag = new GridBagLayout();downPanel.setLayout(girdBag);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 0;girdBagCon.gridwidth = 3;girdBagCon.gridheight = 2;girdBagCon.ipadx = 5;girdBagCon.ipady = 5;JLabel none = new JLabel(“ ”);girdBag.setConstraints(none,girdBagCon);downPanel.add(none);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 2;girdBagCon.insets = new Insets(1,0,0,0);girdBagCon.ipadx = 5;24
girdBagCon.ipady = 5;girdBag.setConstraints(sendToLabel,girdBagCon);downPanel.add(sendToLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx =1;girdBagCon.gridy = 2;girdBagCon.anchor = GridBagConstraints.LINE_START;girdBag.setConstraints(combobox,girdBagCon);downPanel.add(combobox);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 3;girdBag.setConstraints(messageLabel,girdBagCon);downPanel.add(messageLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 1;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessage,girdBagCon);downPanel.add(sysMessage);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 2;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessageButton,girdBagCon);downPanel.add(sysMessageButton);girdBagCon = new GridBagConstraints();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(new WindowAdapter(){
public void windowClosing(WindowEvent e){
stopService();25
}
System.exit(0);
} });/** * 事件處理 */ public void actionPerformed(ActionEvent e){ Object obj = e.getSource();if(obj == startServer || obj == startItem){ //啟動服務端
startService();} else if(obj == stopServer || obj == stopItem){ //停止服務端
int j=JOptionPane.showConfirmDialog(this,“真的停止服務嗎?”,“停止服務”,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
if(j == JOptionPane.YES_OPTION){
stopService();
} } else if(obj == portSet || obj == portItem){ //端口設置
//調出端口設置的對話框
PortConf portConf = new PortConf(this);
portConf.setVisible(true);} else if(obj == exitButton || obj == exitItem){ //退出程序
int j=JOptionPane.showConfirmDialog(this,“真的要退出嗎?”,“退出”,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
if(j == JOptionPane.YES_OPTION){
stopService();
System.exit(0);
} } else if(obj == helpItem){ //菜單欄中的幫助
//調出幫助對話框
Help helpDialog = new Help(this);
helpDialog.setVisible(true);} else if(obj == sysMessage || obj == sysMessageButton){ //發送系統消息
sendSystemMessage();} } /** * 啟動服務端 */ public void startService(){ try{
serverSocket = new ServerSocket(port,10);
messageShow.append(“服務端已經啟動,在”+port+“端口偵聽...n”);
startServer.setEnabled(false);
startItem.setEnabled(false);
portSet.setEnabled(false);
portItem.setEnabled(false);
stopServer.setEnabled(true);
stopItem.setEnabled(true);
sysMessage.setEnabled(true);} catch(Exception e){
//System.out.println(e);} userLinkList = new UserLinkList();
listenThread = new ServerListen(serverSocket,combobox,messageShow,showStatus,userLinkList);listenThread.start();} /** * 關閉服務端 */ public void stopService(){ try{
//向所有人發送服務器關閉的消息
sendStopToAll();
listenThread.isStop = true;
serverSocket.close();
int count = userLinkList.getCount();
int i =0;27
while(i < count){ Node node = 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(“服務端已經關閉n”);
combobox.removeAllItems();
combobox.addItem(“所有人”);} catch(Exception e){
//System.out.println(e);} } /** * 向所有人發送服務器關閉的消息 */ public void sendStopToAll(){ int count = userLinkList.getCount();
int i = 0;while(i < count){
Node node = userLinkList.findUser(i);
if(node == null){
i ++;
continue;
}
try{
node.output.writeObject(“服務關閉”);28
node.output.flush();
}
catch(Exception e){
//System.out.println(“$$$”+e);
}
i++;} } /** * 向所有人發送消息 */ public void sendMsgToAll(String msg){ int count = userLinkList.getCount();//用戶總數
int i = 0;while(i < count){
Node node = userLinkList.findUser(i);
if(node == null){
i ++;
continue;
}
try{
node.output.writeObject(“系統信息”);
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
}
catch(Exception e){
//System.out.println(“@@@”+e);
}
i++;} sysMessage.setText(“");} /** * 向客戶端用戶發送消息 */ public void sendSystemMessage(){ 29
} String toSomebody = combobox.getSelectedItem().toString();String message = sysMessage.getText()+ ”n“;
messageShow.append(message);
//向所有人發送消息
if(toSomebody.equalsIgnoreCase(”所有人“)){ sendMsgToAll(message);} else{ //向某個用戶發送消息
Node node = userLinkList.findUser(toSomebody);
try{
node.output.writeObject(”系統信息“);
node.output.flush();
node.output.writeObject(message);
node.output.flush();} catch(Exception e){
//System.out.println(”!!“+e);} sysMessage.setText(”“);//將發送消息欄的消息清空 } public static void main(String[] args){ try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());} catch(ClassNotFoundException e){
// TODO Auto-generated catch block
e.printStackTrace();} catch(InstantiationException e){
// TODO Auto-generated catch block
e.printStackTrace();} catch(IllegalAccessException e){
// TODO Auto-generated catch block
e.printStackTrace();} catch(UnsupportedLookAndFeelException e){
// TODO Auto-generated catch block
e.printStackTrace();} new ChatServer();} 30
}
2、ServerListen類
功能:實現服務器用戶上線與下線的監聽。該類對用戶上線下線的監聽是通過調用用戶鏈表類(UserLinkList)來實現的。當用戶上線與下線情況發生變化時,該類會對主類的界面進行相應的修改。
代碼:
package server;
import javax.swing.*;import java.io.*;import java.net.*;/* * 服務端的偵聽類 */ public class ServerListen extends Thread { ServerSocket server;
JComboBox combobox;JTextArea textarea;JTextField textfield;UserLinkList userLinkList;//用戶鏈表
Node client;ServerReceive recvThread;
public boolean isStop;
/* * 聊天服務端的用戶上線于下線偵聽類
*/ public ServerListen(ServerSocket server,JComboBox combobox,JTextArea textarea,JTextField textfield,UserLinkList userLinkList){
this.server = server;
this.combobox = combobox;
this.textarea = textarea;
this.textfield = textfield;
this.userLinkList = userLinkList;
isStop = false;}
public void run(){
while(!isStop &&!server.isClosed()){
try{
client = new Node();
client.socket = server.accept();
client.output = new ObjectOutputStream(client.socket.getOutputStream());
client.output.flush();
client.input = new ObjectInputStream(client.socket.getInputStream());
client.username =(String)client.input.readObject();
//顯示提示信息
combobox.addItem(client.username);
userLinkList.addUser(client);
textarea.append(”用戶 “ + client.username + ” 上線“ + ”n“);
textfield.setText(”在線用戶“ + userLinkList.getCount()+ ”人n“);
recvThread = new ServerReceive(textarea,textfield,combobox,client,userLinkList);
recvThread.start();
}
catch(Exception e){
}
} } }
3、ServerReceive類
功能:實現服務器消息收發的類,該類分別定義了向某用戶及所有人發送消息的方法,發送的消息會顯示在主界面類的街面上。
代碼:
package server;
import javax.swing.*;/* * 服務器收發消息的類 */ public class ServerReceive extends Thread { JTextArea textarea;JTextField textfield;JComboBox combobox;
Node client;UserLinkList userLinkList;//用戶鏈表
public boolean isStop;
public ServerReceive(JTextArea textarea,JTextField textfield, JComboBox combobox,Node client,UserLinkList userLinkList){ this.textarea = textarea;this.textfield = textfield;this.client = client;this.userLinkList = userLinkList;this.combobox = combobox;
isStop = false;}
public void run(){ //向所有人發送用戶的列表
sendUserList();
while(!isStop &&!client.socket.isClosed()){
try{
String type =(String)client.input.readObject();
if(type.equalsIgnoreCase(”聊天信息“)){
String toSomebody =(String)client.input.readObject();
String status =(String)client.input.readObject();
String action =(String)client.input.readObject();
String message =(String)client.input.readObject();
String msg = client.username
+” “+ action
+ ”對 “
+ toSomebody
+ ” 說 : “
+ message
+ ”n“;
if(status.equalsIgnoreCase(”悄悄話“)){
msg = ” [悄悄話] “ + msg;
}
textarea.append(msg);
if(toSomebody.equalsIgnoreCase(”所有人“)){ 33
sendToAll(msg);//向所有人發送消息
} else{
try{
client.output.writeObject(”聊天信息“);
client.output.flush();
client.output.writeObject(msg);
client.output.flush();
}
catch(Exception e){
//System.out.println(”###“+e);
}
Node node = userLinkList.findUser(toSomebody);
if(node!= null){
node.output.writeObject(”聊天信息“);
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
} } } else if(type.equalsIgnoreCase(”用戶下線“)){ Node node = userLinkList.findUser(client.username);userLinkList.delUser(node);
String msg = ”用戶 “ + client.username + ” 下線n“;int count = userLinkList.getCount();
combobox.removeAllItems();combobox.addItem(”所有人“);int i = 0;while(i < count){ node = userLinkList.findUser(i);if(node == null){
i ++;
continue;} combobox.addItem(node.username);i++;} combobox.setSelectedIndex(0);34
textarea.append(msg);
textfield.setText(”在線用戶“ + userLinkList.getCount()+ ”人n“);
sendToAll(msg);//向所有人發送消息
sendUserList();//重新發送用戶列表,刷新
break;
}
}
catch(Exception e){
//System.out.println(e);
} } } /* * 向所有人發送消息 */ public void sendToAll(String msg){ int count = userLinkList.getCount();
int i = 0;while(i < count){
Node node = userLinkList.findUser(i);
if(node == null){
i ++;
continue;
}
try{
node.output.writeObject(”聊天信息“);
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
}
catch(Exception e){
//System.out.println(e);
}
i++;} }
} /* * 向所有人發送用戶的列表 */ public void sendUserList(){ String userlist = ”“;int count = userLinkList.getCount();
} int i = 0;while(i < count){ Node node = userLinkList.findUser(i);if(node == null){
i ++;
continue;}
userlist += node.username;userlist += 'n';i++;}
i = 0;while(i < count){ Node node = userLinkList.findUser(i);if(node == null){
i ++;
continue;}
try{
node.output.writeObject(”用戶列表“);
node.output.flush();
node.output.writeObject(userlist);
node.output.flush();} catch(Exception e){
//System.out.println(e);} i++;}
4、UserLinkList類
功能:用戶鏈表節點的具體實現類。該類通過構造函數構造用戶鏈表,定義了添加
用戶、刪除用戶、返回用戶數、根據用戶名查找用戶、根據索引查找用戶這5個方法。
代碼:
package server;/** * 用戶鏈表 */ public class UserLinkList { Node root;Node pointer;int count;
/** * 構造用戶鏈表
*/ public UserLinkList(){
root = new Node();
root.next = null;
pointer = null;
count = 0;}
/** * 添加用戶
*/ public void addUser(Node n){
pointer = root;
while(pointer.next!= null){
pointer = pointer.next;
}
pointer.next = n;
n.next = null;
count++;
}
/** * 刪除用戶
*/ public void delUser(Node n){
pointer = root;
while(pointer.next!= null){
if(pointer.next == n){
pointer.next = n.next;
count--;
break;
}
pointer = pointer.next;} } /** * 返回用戶數 */ public int getCount(){ return count;} /** * 根據用戶名查找用戶 */ public Node findUser(String username){ if(count == 0)return null;
pointer = root;
while(pointer.next!= null){
pointer = pointer.next;
if(pointer.username.equalsIgnoreCase(username)){
return pointer;
} }
return null;} /** * 根據索引查找用戶 */ public Node findUser(int index){ if(count == 0){
return null;38
}
} }
if(index < 0){ return null;}
pointer = root;
int i = 0;while(i < index + 1){ if(pointer.next!= null){
pointer = pointer.next;} else{
return null;}
i++;}
return pointer;
5、Node類
功能:用戶鏈表的節點類,定義了鏈表中的用戶。該類與前面所講的鏈表節點Node類的功能相當。
代碼:
package server;
import java.net.*;import java.io.*;/** * 用戶鏈表的結點類 */ public class Node { String username = null;Socket socket = null;ObjectOutputStream output = null;ObjectInputStream input = null;
Node next = null;39
}
6、PortConf類
功能:該類繼承自Jdialog,是用戶對服務器端監聽端口進行修改配置的類。代碼:
package server;
import java.awt.*;import javax.swing.*;import java.awt.event.*;/** * 生成端口設置對話框的類 */ public class PortConf extends JDialog { /** * */ private static final long serialVersionUID = 1L;JPanel panelPort = new JPanel();JButton save = new JButton();JButton cancel = new JButton();public static JLabel DLGINFO=new JLabel(” 默認端口號為:8888“);
JPanel panelSave = new JPanel();JLabel message = new JLabel();
public static JTextField portNumber;
public PortConf(JFrame frame){
super(frame, true);
try {
jbInit();
}
catch(Exception e){
e.printStackTrace();
}
//設置運行位置,使對話框居中
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((int)(screenSize.width600)/ 2 + 150);
this.setResizable(false);40
}
private void jbInit()throws Exception {
this.setSize(new Dimension(300, 120));
this.setTitle(”端口設置“);
message.setText(”請輸入偵聽的端口號:“);
portNumber = new JTextField(10);
portNumber.setText(”“+ChatServer.port);
save.setText(”保存“);
cancel.setText(”取消“);
panelPort.setLayout(new FlowLayout());
panelPort.add(message);
panelPort.add(portNumber);
panelSave.add(new Label(” “));
panelSave.add(save);
panelSave.add(cancel);
panelSave.add(new Label(” “));
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(panelPort, BorderLayout.NORTH);
contentPane.add(DLGINFO, BorderLayout.CENTER);
contentPane.add(panelSave, BorderLayout.SOUTH);
//保存按鈕的事件處理
save.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent a){
int savePort;
try{
savePort=Integer.parseInt(PortConf.portNumber.getText());
if(savePort<1 || savePort>65535){
PortConf.DLGINFO.setText(” 偵聽端口必須是0-65535之間的整數!“);
PortConf.portNumber.setText(”“);
return;
}
ChatServer.port = savePort;
dispose();
} 41
catch(NumberFormatException e){
PortConf.DLGINFO.setText(” 錯誤的端口號,端口號請填寫整數!“);
PortConf.portNumber.setText(”“);
return;
}
}
});
//關閉對話框時的操作
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
DLGINFO.setText(”
為:8888“);
}
});
//取消按鈕的事件處理
cancel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
DLGINFO.setText(”
為:8888“);
dispose();
}
});} }
7、Help類
功能:服務端程序幫助類。代碼:
package server;
import java.awt.*;import javax.swing.*;import java.awt.event.*;/** 42
默認端口號默認端口號
* 生成設置對話框的類 */ public class Help extends JDialog {
/** * */ private static final long serialVersionUID = 1L;JPanel titlePanel = new JPanel();JPanel contentPanel = new JPanel();JPanel closePanel = new JPanel();
JButton close = new JButton();JLabel title = new JLabel(”聊天室服務端幫助“);JTextArea help = new JTextArea();
Color bg = new Color(255,255,255);
public Help(JFrame frame){
super(frame, true);
try {
jbInit();
}
catch(Exception e){
e.printStackTrace();
}
//設置運行位置,使對話框居中
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((int)(screenSize.width320)/ 2);
this.setResizable(false);}
private void jbInit()throws Exception {
this.setSize(new Dimension(400, 200));
this.setTitle(”幫助“);
titlePanel.setBackground(bg);;
contentPanel.setBackground(bg);
closePanel.setBackground(bg);
help.setText(”
1、設置服務端的偵聽端口(默認端口為8888)。n“+
”
2、點擊 啟動服務 按鈕便可在指定的端口啟動服務。n“+
”
3、選擇需要接受消息的用戶,在消息欄中寫入消息,之后便可發送消息。n“+ 43
}
} ”
4、信息狀態欄中顯示服務器當前的啟動與停止狀態、“+ ”用戶發送的消息和n 服務器端發送的系統消息。“);help.setEditable(false);titlePanel.add(new Label(” “));titlePanel.add(title);titlePanel.add(new Label(” “));contentPanel.add(help);closePanel.add(new Label(” “));closePanel.add(close);closePanel.add(new Label(” “));Container contentPane = getContentPane();contentPane.setLayout(new BorderLayout());contentPane.add(titlePanel, BorderLayout.NORTH);contentPane.add(contentPanel, BorderLayout.CENTER);contentPane.add(closePanel, BorderLayout.SOUTH);close.setText(”關閉“);//事件處理
close.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
dispose();
} });
8、ChatClient類
功能:定義客戶端的界面,添加時間監聽與事件處理。該類定義了Connect()與DisConnect()方法實現與客戶端的連接與斷開連接。當登陸到指定的服務器時,調用ClientReceive類實現消息收發,同時該類還定義了SendMessaga()方法來其他用戶發送帶有表情的消息或悄悄話。
代碼:
package client;
import java.awt.*;import java.awt.event.*;import javax.swing.*;
import java.io.*;import java.net.*;/* * 聊天客戶端的主框架類 */ public class ChatClient extends JFrame implements ActionListener{
/** * */ private static final long serialVersionUID = 1L;String ip = ”127.0.0.1“;//連接到服務端的ip地址
int port = 8888;//連接到服務端的端口號
String userName = ”匆匆過客“;//用戶名
int type = 0;//0表示未連接,1表示已連接
JComboBox combobox;//選擇發送消息的接受者
JTextArea messageShow;//客戶端的信息顯示
JScrollPane messageScrollPane;//信息顯示的滾動條
JLabel express,sendToLabel,messageLabel;
JTextField clientMessage;//客戶端消息的發送
JCheckBox checkbox;//悄悄話
JComboBox actionlist;//表情選擇
JButton clientMessageButton;//發送消息
JTextField showStatus;//顯示用戶連接狀態
Socket socket;ObjectOutputStream output;//網絡套接字輸出流
ObjectInputStream input;//網絡套接字輸入流
ClientReceive recvThread;
//建立菜單欄
JMenuBar jMenuBar = new JMenuBar();//建立菜單組
JMenu operateMenu = new JMenu(”操作(O)“);//建立菜單項
JMenuItem loginItem = new JMenuItem(”用戶登錄(I)“);JMenuItem logoffItem = new JMenuItem(”用戶注銷(L)“);JMenuItem exitItem=new JMenuItem(”退出(X)“);
JMenu conMenu=new JMenu(”設置(C)“);JMenuItem userItem=new JMenuItem(”用戶設置(U)“);JMenuItem connectItem=new JMenuItem(”連接設置(C)“);
JMenu helpMenu=new JMenu(”幫助(H)“);JMenuItem helpItem=new JMenuItem(”幫助(H)“);//建立工具欄
JToolBar toolBar = new JToolBar();//建立工具欄中的按鈕組件
JButton loginButton;//用戶登錄 JButton logoffButton;//用戶注銷 JButton userButton;//用戶信息的設置 JButton connectButton;//連接設置 JButton exitButton;//退出按鈕
//框架的大小
Dimension faceSize = new Dimension(400, 600);JPanel downPanel;GridBagLayout girdBag;GridBagConstraints girdBagCon;
public ChatClient(){ init();//初始化程序
//添加框架的關閉事件處理
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.pack();//設置框架的大小
this.setSize(faceSize);//設置運行時窗口的位置
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)(screenSize.widthfaceSize.getHeight())/ 2);this.setResizable(false);this.setTitle(”聊天室客戶端");//設置標題 setVisible(true);//為操作菜單欄設置熱鍵'V' operateMenu.setMnemonic('O');46