JAVA 仿QQ聊天程序(附源码)
個人推薦:
📢📢📢 前些天發現了一個蠻有意思的人工智能學習網站,8個字形容一下 "通俗易懂,風趣幽默",感覺非常有意思,忍不住分享一下給大家。點擊跳轉到教程。
前言:
第一次通過java編寫完了一個模擬QQ的C/S軟件【開心,感覺用C#寫C/S要舒服的多啊,哈哈哈…】,項目是通過三層架構編寫,由于對JavaJDBC不是很熟悉,所有數據交換寫的是真的垃圾啊,軟件還是存在一些問題的,比如文件傳輸,由于沒有采用線程,軟件打開一次只能傳輸一次,還有就是要先發送端點擊發送后才能,點擊接受不然接受不到數據…軟件還是挺不錯【自夸一下狗頭】,其他的問題就不說了,自己去看源碼吧…
本篇博文目錄:
- 一.三層架構簡要分析
 - 二.三層架構命名規范
 - 三.項目搭建:QQ項目
 - 四.相關功能的實現講解
 - 五.QQ項目部署
 - 六.軟件效果預覽
 - 七.下載鏈接(舊版本)
 - 八.項目更新
 
一.三層架構簡要分析
DAL----數據訪問層
 BLL-----業務邏輯層
 UI-------表示層
 (注:三層通過實體對象進行數據傳遞)
 
二.三層架構命名規范
三.項目搭建:QQ項目
1:com.cqgy.qq[程序入口]
 客服端:Client
 客服端接口:SetparametersFrameClient
 接口界面:
 
 服務端:Server
 服務端接口:SetparametersFrameServer 
 接口界面:
 
 2:UI表示層
 
 com.cqgy.ui
 登入界面:LoginFrame;注冊界面:RegistrationFrame;找回密碼界面:RetrievePasswordFrame;
 
 
 
 聊天界面:ChatFrameTest;主界面:MainFrame;自動登入加載頁面:
 
 
 
 AddFriendsFrame:添加好友刪除好友,查詢好友;FriendsInfo Frame: 用戶信息界面
 
 
 
 3:BLL:業務邏輯層
 com.cqgy.method
 
 用戶操作業務邏輯層:UserDao
 【感覺業務很多實屬扯蛋,都是為了交作業狗頭**】**
 業務1:登入功能;
 業務2:注冊功能;
 業務3:查詢所有用戶消息;
 業務4:按照主鍵查詢;
 業務5:查詢是否為好友;
 業務6:查詢用戶登入狀態;
 業務7:修改用戶密碼;
 業務8:更改用戶名;
 業務9:刪除好友;
 業務10:查詢好友列表;
 業務11:保存賬號和密碼;
 業務12:保存登入界面上的單選按鈕狀態;
 業務13:讀取賬號和密碼;
 業務14:添加好友
 4:DAL:數據訪問層
 Com.cqgy.db
 
 DBHelper:對數據庫基本操作【增刪改查,帶參增刪改查,存儲過程,事務】
 注:由于對java數據庫不是很熟悉,這里我直接創建UserDB類來對數據進行處理,處理方式不是很恰當,很多地方出現重復較多可以通過復用技術進一步優化,但是更好的辦法還是通過DBHelper對數據進行處理更符合三層架構的思想。
 UserDB:對業務層涉及到數據交互部分進行數據方法的提供,比如業務1實現添加數據,UserDB直接提供一個添加數據的方法,業務層直接執行即可,不接觸數據交互部分。
 5:Entity:實體對象
 Com.cqgy.bean
 
 對實體對象進行封裝,更有利于訪問實體對象.
6:Common:常用操作
 com.cqgy.ui.commmon
 
 將經常使用的方法進行封裝到一個類中,避免代碼重復書寫,這里主要是文件的讀取寫入和驗證碼的生成,錯誤日志的寫入。
 7:Com.cqgy.util:工具類
 對數據進行驗證等工具方法。
 
四.相關功能的實現講解
1.自動登入功能
 [主窗體]
 
 
 
 【自動登入窗體】
 
 
2.用戶是否在線功能
 【數據訪問層】
 
 【業務層】
 
 【UI表示層】
 
 3.注冊功能
 【數據訪問層】
 
 【業務邏輯層】
 
【UI表示層】
 (1):數據驗證部分
 
 (2):初始化實體對象
 
 (3):實現登入業務
 
 4.找回密碼功能
 【數據訪問層】
 
 【業務邏輯層】
 
 【UI表示層】
 (1)數據驗證
 
 (2)封裝對象
 
 (3)實現業務
 
[5.查詢用戶信息功能;6.搜索功能;7.添加好友;8.刪除好友;9.修改好友信息;10.聊天功能;5,6,7,8,9,10:功能和前面基本一致,Ui表示層實現業務,業務邏輯層提供業務,數據傳輸層提供業務對數據的操作方法]。
【調試】
 搜索功能—搜索出來的用戶不同可操作的信息也不同
 
11.文件傳輸功能
 【注:】文件傳輸功能未采用線程方式,所以程序運行一次只可傳輸一次文件
 【發送端】
 (1)文件可以通過拖拽的方式獲取文件全路徑(接受端有講解)
 通過start進行發送
 
 (2)當有接受端進行了解了才能進行下一步操作不然會一直阻塞accept()中
 
 (3)通過流的方式發送數據
 
 (4)更新count標識(接受端有講解
 
 【接受端】
 (1)選擇保存路徑
 這里通過拖拽的方式獲取文件保存路徑,也可以直接復制路徑
 聲明路徑變量
 
 事件監聽
 
 實現事件邏輯
 
 (2)用戶點擊接受后獲取數據(這里要發送端發送數據后才能進行接受不然會產生異常)
 
 處理該目錄下的文件名是否重復,重復在文件名后加(i)形式
 
 獲取發送端的數據
 
 如果未接受到數據,將會一直停留在這里,進度條顯示進度
 
 由于程序啟動一次只能傳輸一次,所以這里加入count標志count=0表示未使用count=1表示已經使用
 
 【調試】
 
 12:圖片傳輸功能(具體代碼操作請查閱源碼)
 
五.QQ項目部署
(1):數據庫部署
 在配置文件中配置自己數據庫一致的參數
 
 (2)在mysql5.6中加入數據庫
Mysql8.0版本需要將配置文件中 driver=com.mysql.jdbc.Driver
 修改為driver=com.mysql.cj.jdbc.Driver
(3)在數據庫中創建數據庫和表格并添加數據
------創建表結構和數據庫
/* 創建數據庫 */ CREATE DATABASE IF NOT EXISTS qq; use qq; /* 用戶表 */ CREATE TABLE IF NOT EXISTS user (user_id varchar(80) not null, /* 用戶Id */user_pwd varchar(25) not null, /* 用戶密碼 */user_name varchar(80) not null, /* 用戶名 */user_icon varchar(100) not null, /* 用戶頭像 */state int(2) not null,PRIMARY KEY (user_id) );/* 用戶好友表Id1和Id2互為好友 */ CREATE TABLE IF NOT EXISTS friend (user_id1 varchar(80) not null, /* 用戶Id1 */user_id2 varchar(80) not null, /* 用戶Id2 */ PRIMARY KEY (user_id1, user_id2) );-------添加數據
use qq;/* 用戶表數據 */ INSERT INTO user VALUES('111','123', '關東升','28',0); INSERT INTO user VALUES('222','123', '趙1', '30',0); INSERT INTO user VALUES('333','123', '趙2', '52',0); INSERT INTO user VALUES('888','123', '趙3', '53',0);/* 用戶好友表Id1和Id2互為好友 */ INSERT INTO friend VALUES('111','222'); INSERT INTO friend VALUES('111','333'); INSERT INTO friend VALUES('888','111'); INSERT INTO friend VALUES('222','333');【注意:插入數據時如果出現了以下錯誤】 14:00:58 INSERT INTO user VALUES(‘111’,‘123’,
 ‘關東升’,‘28’,0) Error Code: 1366. Incorrect string value:
 ‘\xE5\x85\xB3\xE4\xB8\x9C…’ for column ‘user_name’ at row 1 0.000
 sec
在數據庫中輸入:
alter table user convert to character set utf8; alter table friend convert to character set utf8;然后再執行添加數據操作:
use qq; /* 用戶表數據 */ INSERT INTO user VALUES('111','123', '關東升','28',0); INSERT INTO user VALUES('222','123', '趙1', '30',0); INSERT INTO user VALUES('333','123', '趙2', '52',0); INSERT INTO user VALUES('888','123', '趙3', '53',0);/* 用戶好友表Id1和Id2互為好友 */ INSERT INTO friend VALUES('111','222'); INSERT INTO friend VALUES('111','333'); INSERT INTO friend VALUES('888','111'); INSERT INTO friend VALUES('222','333');(3)啟動服務端接口
 
 輸入端口號,然后點擊設置
 
(4)啟動客服端,設置IP并點擊設置
 
 
(5)程序運行
 
六.軟件效果預覽
 
七.下載鏈接(舊版本)
鏈接: https://pan.baidu.com/s/14BaDEJ9F0Tk8ToG0PmQl4Q
 提取碼:w5ae
 
 
八.項目更新
###更新時間:2022年6月8號###
最近發現這個項目還是挺多人下載的,并且也收到很多朋友的留言,在安裝的時候出現很多問題,所以這里對大家的問題進行一個匯總,并方便后面的朋友更容易安裝和使用。
問題1:mysql安裝的版本是8.0的問題?
解決步驟1:
 在配置文件中將driver修改為driver=com.mysql.cj.jdbc.Driver
 
解決步驟2:
 下載mysql8.0驅動
驅動下載:
- 百度網盤方式下載( 驅動是我隨便在網上搜索的8.0的驅動 )
 
鏈接:https://pan.baidu.com/s/1gTKoAYoKVoo8pitZGLeAbQ
 提取碼:clhp
- mysql官網下載驅動
 
當然我們也可以去mysql官方下載自己需要的版本,官網地址https://downloads.mysql.com/archives/c-j/:
 將下載下來的文件進行解壓,我們只需要復制 mysql-connector-java-8.0.28.jar 文件即可:
 
 解決步驟3:
 在項目中添加8.0的mysql驅動
將復制的jar文件復制到項目中,并且進行Build Path
 
 
 在Referenced Libraries中就會增加8.0的驅動
 
問題2:二臺電腦之間是否可以通過軟件進行聊天?
原有程序的話,是不可以的,因為在Server類下,有一個clientList的集合用于保存用戶信息,在原來的代碼中是直接創建的一個靜態集合,所以當在二臺機器上運行的時候,另外一臺是無法獲取到這個集合,所以就無法實現二臺PC直接的通信,解決辦法是將用戶登入的信息保存的數據庫中即可解決。
修改后的代碼,我在虛擬機上進行了簡單的測試(Linux可以將數據發送到Windows機器上,但是Windows機器上無法發送消息到Linux上,我猜測應該是Linux防火墻問題,Windos機器上的防火墻是關閉的(
 所以一定要把Windows的防火墻進行關閉 ),如果二臺Windows的話,將二臺的防火墻關閉,理論上是可以實現通信的,由于代碼是很久以前寫的了,我也只是簡單的修改一下,如果出現什么問題,你需要自己動手修改一下)
二臺機器聊天截圖:
 
問題3:該項目是使用的UDP還是TCP?
 該項目是一個純UDP項目,大致的通信圖如下:
 ( 圓圈部分是服務器端,長方形部分為客戶端 )
通信原理就是客戶端將數據(包括接收方姓名,發送的數據)發送到本機上的服務端,服務端根據數據的接收方的信息,查找對應的Ip和端口號,將數據直接放給接收方(另一臺電腦的客戶端),同樣的另外一臺電腦也是如此。
問題4:修改后的程序部署問題?
 步驟一:修改數據庫地址
 在前面我們是直接使用的本機地址,所以這里需要修改數據所在機器的IP地址
 
 步驟二:mysql允許遠程訪問:
 ( "注意:使用root方式進行登入是非常危險的,所以建議最好就是新建一個用戶,并授予相應權限" )
 操作方法可以學習這一篇博客:MySQL初始化root密碼和允許遠程訪問
這里記錄一種方式就是授權:
登入mysql然后執行下面sql語句:
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY'123456' WITH GRANT OPTION; mysql>flush privileges;步驟三:導入數據庫
 數據庫這里我直接導出來了,放在 /項目源碼/QQ/db/qq.sql
 
步驟四:端口號和IP怎么輸入
Ip地址只能夠輸入當前電腦的IP地址,端口號二臺機器保持同一個端口號即可(當然是未使用的端口)。
 問題5:修改后的程序的下載?
 最近在玩微信公眾號,嘻嘻,也方便自己資源管理,微信公眾號搜索程序員孤夜(或掃描下方二維碼),后臺回復 QQ源碼 ,即可獲取源碼,如果有什么問題,后臺留言我看見第一時間就會回復你喔!
 
總結
以上是生活随笔為你收集整理的JAVA 仿QQ聊天程序(附源码)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: java实现简单QQ登录界面
 - 下一篇: 基于matlab的圆柱齿轮减速器优化设计