登陸介面
註冊賬號
找回密碼
重設密碼
聊天介面
多人聊天
一、 設計任務1.1設計意義《Java基礎入門》課程設計是對學生的一種全面綜合訓練,它包括問題分析,使用者介面設計,程式設計基本技能和技巧,多人合作。課程設計是比平時的習題複雜,也更接近實際,使學生學會如何把書本學到的知識應用於解決問題上,使書上的知識變活。同學錄作為一種方便同學之間的聯絡的使用系統應運而生,為同學之間進行交流和聯絡提供一個平臺。透過提供完善的同學錄服務和規範同學錄的管理,可以達到增進同學之間、同學與母校之間的情感,方便校友聯絡的目的。
1.2設計目的1.全面熟悉和掌握所學到的Java語言知識和技能,運用多執行緒、網路程式設計、JDBC、GUI、集合以及陣列、函式等方法,同時也需要運用Mysql等相關知識完成聊天小程式。
2.鞏固基本知識,驗證自身的學習效果,進一步提高上機動手能力,培養使用計算機解決問題的技巧,為以後的學習奠定基礎。
1.3設計任務聊天小程式是典型的TCP示例系統,根據所學知識,用面對物件、多執行緒、GUI、集合、JDBC等知識相結合,實現聊天小程式的登陸介面、註冊介面、找回密碼介面、聊天介面,以及每個介面的一些詳細功能,並建立資料庫做出資料的交匯,能夠實現聊天介面的多人聊天和私人聊天。
要求: 1)使用圖形使用者介面;;
2)能實現一個聊天室多人聊天
3)可以兩人私聊;
二、 需求分析2.1功能需求分析2.1.1使用者介面分析分為登陸介面、註冊賬號介面、找回密碼介面和聊天介面。
2.1.2使用者功能分析實現使用者註冊、密碼找回、記住密碼、夜間模式、使用者登入、聊天等主要功能。
使用者註冊:使用者透過設定暱稱,賬號,密碼和密保上傳到資料庫以實現登入,如果賬號已被註冊已存在會提醒賬號已存在,並重新註冊。
密碼找回:使用者透過輸入賬號,並根據註冊賬號時填寫的密保資訊進行匹配,匹配上後則會提供使用者修改密碼。若密碼錯誤或者密碼不存在會做出相應提示。
記住密碼:使用者在登陸前透過勾選“記住密碼”複選框,併成功登入,則會把賬號和密碼資訊儲存在remember表裡,下次開啟登陸介面後就會把使用者資訊填充到下拉框和密碼框裡。已經儲存過的,不會重複儲存。
夜間模式:使用者登陸前透過勾選“夜間模式”複選框,就會切換登陸介面和聊天介面黑色的背景顏色。
使用者登入:使用者透過輸入賬號和密碼以匹配資料庫表裡的資訊,輸入資訊錯誤會做出相應提示。
聊天:有好友上線會新增到好友列表,下線會從列表裡移除,並會收到好友上下線的資訊通知,透過選著好友會切換到相對的文字域,以實現聊天資訊分離,並在JList列表框裡有群聊選項以實現公共聊天。
2.2資料需求分析資料庫包含兩個表,分別是login還有remember,分別儲存使用者註冊資訊,用來對使用者登入進行判斷,並對使用者申請找回密碼提供資料依據;和使用者選擇記住密碼的帳號密碼資訊,用來下次開啟登陸介面直接有賬號和密碼填充。
三、 系統設計3.1概要設計3.1.1登入介面該介面是確認使用者資訊,如果用資訊不匹配,則會提醒資訊錯誤,這時可以透過註冊按鈕功能註冊使用者資訊,或者透過找回密碼按鈕來更改密碼;另外,如果一個賬號已經登陸過。系統會阻止該賬號的再次登入。
3.1.2主介面該介面是透過JscrollPane滾動面板面板、JList列表、JTextarea文字域,並把JList列表和JTextarea文字域新增到JscrollPane來實現“朋友列表”、“訊息顯示文字域”、“訊息輸出文字域”、“訊息通知”。JLIst列表裡存放線上使用者,並透過選擇“朋友列表”中的不同使用者獲取與之對應的“顯示文字域”,並透過TCP協議、多執行緒實現每個人的聊天資訊的分離。並設有“傳送”和“清空”兩個按鈕,並添加了對應的監聽事件,前者用於把“訊息輸出文字域”上的資訊顯示到顯示“訊息顯示文字域”上,收到訊息的使用者會在“訊息通知”顯示收到訊息的來源和時間,後者用於清除過多的訊息通知。
3.2 詳細設計3.2.1 MainWindow和CreateJpanel類MainWindow類中有mian方法,透過呼叫CreateJpanel類中的方法來實現登陸介面,而CreateJpanel類裡就是具體實現登陸介面的程式碼,用JPanel面板分為五行,一次存放了聊天小程式的圖示、賬號登入下拉框、密碼框、記住密碼和夜間模式複選框以及登入註冊還有找回密碼按鈕,每一行就是一個方法,然後最後再把這這五個面板放到一個大面板中以更好的實現後面的“夜間模式”功能。
CreateJpanel類中的方法:
fistline(JFrame frame)、secondline()、thirdline()、forthline()、fifthline(JFrame frame)功能:分別用於建立登陸介面的一到五行。其中第三行對下拉列表框做了事件監聽,當選中列表框裡儲存的賬號時密碼框便會設定為與之匹配的密碼,對密碼框加了焦點監聽器,當密碼框獲得滑鼠焦點的時候下邊框便會加粗變藍以增加體驗,還實現按回車鍵點選登入按鈕的效果,對密碼框後面的密碼顯示按鈕添加了動作事件,以便點選之後可以實現對密碼的隱藏和顯示;第四行對“記住密碼”和“夜間模式”兩個按鈕加了事件監聽以判斷是否被選擇;第五行對“註冊賬號”和“找回密碼”兩個按鈕加了自定義監聽,以便於點選之後可以分別跳轉到註冊賬號和找回密碼介面,並且還對兩按鈕添加了滑鼠監聽器,以實現當滑鼠移入字型變藍的效果,增強體驗,對“登入按鈕”也添加了自定義監聽,並當滑鼠移過時會更換按鈕圖示以增強體驗。
adduser()功能:調動資料庫的remember表格,把使用者曾選擇記住密碼的賬號新增到下拉列表框。
3.2.2 My_combox、My_Jlist、My_ScrollPane、SetBaseConnect類前三個類分別繼承了JComboBox<String>、JList<String>、JScrollPane,主要是對這些元件進行美化,如My_combox就是美化了下拉列表框右方的按鈕,My_Jlist則是使得Jlist列表裡的選項可以居中顯示,並改變了其字型樣式,而My_ScrollPane美化了滾動面板的捲軸,隱藏了捲軸的按鈕並重新繪製了滑塊。而SetBaseConnect類則是用來與資料庫建立連線的類,其中定義了Connection getconn()方法用來建立資料庫連線,當連線失敗會提示資料庫連線失敗,還有close(Connection conn,PreparedStatement ps)方法用來關閉連線並釋放資源。
3.2.3 RegisterWindow、RetrievepassWindow類這兩個類都實現了ActionListener介面,達到自定義監聽事件的目的。
RegisterWindow類是註冊賬號的介面,與登陸頁面的“註冊賬號”按鈕繫結,進入介面需要按要求填寫相應資訊進行註冊賬號,若填寫資訊不對則會有相應的提示,並對輸入賬號和密碼的文字框加了鍵盤監聽器,前者只允許輸入數字,後者只允許輸入數字和字母。對提交按鈕加了事件監聽器,當所有資訊填寫符合要求便會連線資料庫對使用者註冊資訊進行儲存,如果註冊賬號已經存在會做出提示。類中有一個addFocusListener(JTextField text,String hintText)方法,用來給輸入框新增提示,當輸入框沒有獲得焦點並且框內沒有輸入字元時便會使提示資訊顯示於輸入框內,並且當滑鼠懸浮於輸入框之上也會獲得提示資訊。
RetrievepassWindow類是找回密碼的介面,與登陸介面的“找回密碼”按鈕繫結,進入頁面需要填寫要找回密碼的賬號,並需填寫註冊賬號是填寫的密保資訊以確定使用者身份,填寫錯誤會有相應的錯誤提示,資訊填寫正確會進入新的介面來對密碼進行修改。類中呼叫了RegisterWindow類的addFocusListener(JTextField text,String hintText)方法,對所有的輸入框添加了文字提示。
3.2.4 User、Server、Sockets類User類是用於建立使用者物件的類,其內有私有的name、id、sock私有變數並且有對應的set、get方法。
Server類是聊天小程式的伺服器實現類,有著線上使用者ArrayList<User> userlist和輸出流ArrayList<PrintWriter> list這兩個重要的集合,定義了最終的埠號為6666,類中有著一個Main內部類,該內部類實現了Runnable介面,構造方法需要一個socket,在重寫的run方法中用socket獲取包裝了一個緩衝區輸入流,不斷接收客戶端發來的請求並作出相應的回覆。getServer()方法用來建立伺服器,並在while(true)中不斷接收客服端的連線請求,然後建立客戶的輸出流新增至輸出流集合,並開啟該客服的服務執行緒。sendMessage(String message)方法是遍歷輸出流集合,以實現群發功能。
Sockets類是聊天小程式客戶端的實現類,類中有一個Part內部類,構造方法需要一個socket,在重寫的run方法中用socket獲取包裝了一個緩衝區輸入流,不斷接收伺服器發來的命令並在主頁面做出相應的行動。Sockets的構造方法中添加了建立socket連線,建立並開啟客戶端執行緒的語句。
3.2.4 OnloginWindow類該類是主頁面即聊天頁面的實現類,該類實現了ActionListener介面,達到自定義監聽事件的目的,並與登陸介面的“登入”按鈕繫結,重寫的actionPerformed(ActionEvent e)方法中實現對登陸介面賬號和密碼資訊的判斷,資訊錯誤會有相應的提示,輸入資訊正確則會呼叫相應的方法切換到聊天主頁面。(我在其中加了四個測試賬號,以便不連線資料庫也能登入)
getOnloginWindow(String name, String id, boolean black)方法,在repeatlogin(String name, String id, String password, boolean black)方法中被呼叫,用於獲取聊天頁面,方法需要三個引數,第一個是使用者的暱稱,第二個是使用者的賬號,第三個是登陸介面“夜間模式”複選框是否勾選的標識,若勾選會更改背景顏色為灰色。
repeatlogin(String name, String id, String password, boolean black)方法,該方法透過伺服器遍歷線上使用者集合,若重複登入就傳送給客戶端“repeat”標識,然後客戶端把OnloginWindow類的靜態布林變數flage的值改為true,來實現防止同一賬號多次登入。這個方法還會判斷CreateJpanel類中的靜態布林變數remember的值來確定登入介面的“記住密碼”複選框是否被選中,如果被選中則會把方法傳入的id和password儲存到資料庫remember表中,已經儲存過的不會重複儲存。
四、 系統實現4.1登入視窗登入介面主要是用於確定使用者身份;呼叫其他窗體的一個操作介面,輸入賬號,密碼,點選“登入”按鈕,連線MySQL資料庫,用select語句在表user中查詢是否賬號和密碼是輸入的記錄,查詢到得到關閉登入視窗,顯示系統主介面;沒有查詢到彈出訊息框提示相應的輸入資訊錯誤。點選“註冊賬號”進入註冊賬號頁面,點選“找回密碼”進入找回密碼頁面。
4.2註冊賬號視窗進入該視窗依次填寫註冊資訊,填寫錯誤會有錯誤提示,賬號存在也會有提示,成功註冊會把註冊資訊儲存在資料庫的login表中。
4.3找回密碼視窗依次填寫賬號和對應的密保資訊,資訊錯誤會有相應提示,正確會彈出修改密碼的視窗。 重新設定密碼即可。
五、 總結5.1聊天功能的具體實現總結主要是 Server類、Sockets類和OnloginWindow類來實現,每次登陸時呼叫OnloginWindow類中的sock()方法,建立客服端物件,然後伺服器接收到連線請求,在sock()方法中建立客戶的輸出流,傳送“friendlist”好友列表標識,並把使用者的暱稱賬號資訊連線成字串以分隔符分開發,送伺服器端有專門的輸入流不停讀取客戶端發來的匹配表示,當讀到“friendlist”時便會把收到的資訊以分隔符分割成陣列儲存,然後遍歷線上使用者集合,判斷該使用者是否已經登陸。若已經登陸會發給客戶端“repeat”標識,關閉該socket,並改變使判斷使用者是否已經登陸的靜態標識為true,透過OnloginWindow類中的repeatlogin方法進行判斷從而防止重複登入;若該使用者還未登入,就傳送給客戶端“frendlist”標識,並把已經登陸過的使用者資訊連線成字串傳送該該客服端,然後再發送“norepeat”的標識發給客戶端,客戶端讀到“friendlist”標識便把收到的使用者資訊新增到好友列表中,讀到“norepeat”標識就把判斷使用者是否已經登陸的靜態標識的值改為false。
接著客戶端繼續傳送“add”標識,以告訴其他使用者自己已上線,把自己的資訊加入其他線上客戶列表中,伺服器讀到“add”便會遍歷輸出流集合,迴圈條件為0~長度減2,即對除去自己外其他所有線上使用者的輸出流傳送“add”和暱稱賬號資訊,併發送“notice”標識和上線通知,讀到“add”和“notice”標識的使用者便會把讀到的使用者資訊新增到自己的好友列表中,並在訊息通知欄中顯示好友上線通知。
當客戶端選中好友列表中的“群聊”選項時便會輸出“public”標識,然後伺服器便會呼叫sendMessage群發方法,傳送給每個客戶端“public”標識,併發送聊天資訊,然後傳送“notice”訊息通知標識,對每個使用者傳送收到群資訊提示,客戶端收到伺服器發來的“public”標識後就把聊天資訊顯示在每個客服聊天介面群聊顯示文字域上面,讀到“notice”。
當客戶端選中好友列表某一好友選項時,就會向伺服器傳送“private”私密聊天標識,併發送聊天兩者的使用者資訊和聊天內容,伺服器讀到“private”標識後會把傳送者的資訊和接受者的資訊還有聊天資訊分隔開,然後遍歷線上使用者集合,以匹配發資訊使用者和接收資訊使用者,對發信息的使用者傳送“privateOrigin”傳送者標識,併發送“你對…說…”,對接收資訊的使用者傳送“notice”訊息通知標識,告知該使用者收到誰發來的訊息,以便該使用者切換到該使用者的訊息框讀取訊息,然後傳送“privateTarget”接收者標識,併發送“…對你說…”,對應的客戶端收到這兩個標識時便會把訊息顯示在相應的顯示資訊文字域上。
當客戶端退出聊天頁面時,便會向伺服器傳送“exit”退出標識,併發送使用者資訊,伺服器讀到“exit”標識後就會從線上使用者集合和輸出流集合中移除該使用者的資訊,關閉該使用者的socket,群發“exit”退出標識和該使用者資訊,並群發“notice”標識通知該使用者下線,其他使用者讀到“exit”標識後就會把該使用者移除好友列表,讀到“notice”標識就會把該使用者下線資訊顯示到訊息通知欄裡。
5.2設計總結透過這次課程設計我收穫到了很多,用於實現聊天小程式的很多知識都是書上不曾學習過的,比如JList列表,Jcombox的美化等等,每有一個不會的未曾學習到的方法,我都要上網先把這部分知識學習一遍,然後再做試驗,最後新增到程式碼中來,其中用了時間很長的部分便是一些元件的美化,還有針對每個使用者聊天時可以切換聊天框面板的功能,最後就是放重複登陸的功能,我反覆實驗、學習,最終得以時實現,做完課程設計,我提高最大的就在多執行緒、GUI、還有網路程式設計這一塊,對它們的學習有了更深的瞭解和認知,當然,這次課程設計也沒有達到我想象中的樣子,終究是學習知識有限,就比如聊天室能實現像QQ微信一樣,能有聊天氣泡、能夠傳送檔案還有圖片,這些都還需要我接下來的學習才能實現,我下面也會逐步的完善它,豐富它的功能。