亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Socket通信小項目--大山QQ(簡易版本)附源碼

系統(tǒng) 2297 0

我是一個新手,學(xué)習(xí)了Socket通信后,寒假花了20天寫了這個小項目,只有一個客戶端,而且也是一個尚未完工的客戶端,服務(wù)器端只用來接收,轉(zhuǎn)發(fā)或保存消息。本不準備發(fā)出來的,因為項目還在編寫當中,實現(xiàn)的功能不多,且一些細節(jié)還沒有處理好,以后還會再寫一個比較細致的版本,不過老師要求了,就動手寫了這篇總結(jié)。

?

項目名稱: 大山QQ 用以紀念我的大三

?

項目意義 :對相關(guān)知識點的一個綜合練習(xí),熟悉Java通信方面的類的用法及組件的應(yīng)用,記錄我大三的學(xué)習(xí)痕跡。

?

通信協(xié)議 :字節(jié)流協(xié)議

?????????????

功能

1.注冊

2.查找

3.添加/刪除好友

4.添加/刪除分組

5.好友上下線提醒

6.發(fā)送在線離線消息

7.發(fā)送在線離線文件

?

界面 :全部采用空布局,所有組件都是通過setBounds(....)方法添加的

?

具體流程

?

服務(wù)器端

?????????? 服務(wù)器端還沒有怎么寫,只實現(xiàn)了基本的消息傳送功能。

??????????? 開啟服務(wù)器以后,首先讀取所有的用戶信息,等待客戶端的鏈接。由于尚未學(xué)習(xí)數(shù)據(jù)庫,所有的用戶信息都是

以文件形式保存的。當開啟服務(wù)器后,讀取的所有用戶信息都保存在輔助靜態(tài)類ChatTool的一個用戶Map<User_ID,User>中,當客戶端連接上后,若為登錄消息且ID和password都正確,則將Client_Thread(服務(wù)器端的用戶通信線程類)添加至ChatTool類的線程Map<User_ID,Client_Thread>中,當客戶端向流中寫入消息后,對應(yīng)服務(wù)器通信線程讀取該消息,并作出對應(yīng)操作。

?

客戶端

?

1.登錄

????????????
Socket通信小項目--大山QQ(簡易版本)附源碼


?賬號密碼框只能輸入10位以內(nèi)的數(shù)字0到9,實現(xiàn)方法有兩種 1.添加DocumentListener 2.添加keyListener

??????????????????????????????????? 具體見包MyComponent下的MyJTextField類

界面中的找回密碼,設(shè)置只是按鈕,還未添加功能。

?

若是賬號密碼均正確,服務(wù)器回發(fā)個人信息,包括賬號,簽名,頭像,以及好友信息,未讀消息等,建立緩存,存儲好友的頭像,然后轉(zhuǎn)入好友列表界面。??

?

這一步有待改進,頭像的字節(jié)長度遠遠大于其他信息的字節(jié)長度,在本機建立好友頭像緩存,可以減少信息的傳輸,提高通信速度。?

?

?改進方法:登錄前檢測本機好友頭像的個數(shù),傳送登錄信息時加上本機好友頭像的好友ID,服務(wù)器只回發(fā)其他好友的頭像以及更改了頭像的好友頭像即可。這一步更麻煩了,不過通信效率的提升很可觀。

?

?

2.注冊

?

?
Socket通信小項目--大山QQ(簡易版本)附源碼
?

做注冊界面時,重要的就是在發(fā)送注冊消息前先檢測輸入的數(shù)據(jù)是否合法,并予以提示

?

Socket通信小項目--大山QQ(簡易版本)附源碼

?

當所有的信息都無誤了,再向服務(wù)器發(fā)送消息。若注冊成功,服務(wù)器端保存用戶信息,我最開始是用一個文件保存的,

后來做其他功能時發(fā)現(xiàn)要修改用戶信息時會很麻煩,后改為每一項信息保存為一個文件。

注冊成功,回發(fā)消息,提示,返回登錄界面。

?

做注冊功能的時候,我意識到應(yīng)該要有容錯處理,一切數(shù)據(jù)都合法的情況下再提交至服務(wù)器。

?

3.好友界面


Socket通信小項目--大山QQ(簡易版本)附源碼
?

界面上的所有圖標都是JButton,setIcon(icon),沒有什么用處,主要是仿QQ,以后添加功能方便些

JTree顯示好友,頭像,賬號,昵稱,是否在線,簽名

具體功能有5個

????? 1.添加/刪除分組?? 2.刪除好友?? 3.搜索用戶(search)? 4.雙擊好友頭像,彈出聊天界面

?

4.用戶查找界面


Socket通信小項目--大山QQ(簡易版本)附源碼

?

ID查找和昵稱查找等的實現(xiàn)方法是相同的,所以就只做了一個ID查找

服務(wù)器讀取要查找的用戶ID,若存在就回發(fā)該用戶ID,昵稱等模糊查詢回發(fā)的就是所有滿足搜索條件的用戶信息

?

當點擊添加好友時,服務(wù)器接收到消息后首先檢查被添加用戶是否在線,在線發(fā)送消息,不在線就在被請求用戶未讀消息目錄下的聊天消息下生成一個文件,寫入消息。當被請求者用戶上線時,服務(wù)器發(fā)送其信息時包含這些未讀消息,同時刪除未讀消息文件。

?

這是另一個我覺得很重要的地方----要保證信息的不丟失

?

比如A請求添加B為好友,首先A向服務(wù)器發(fā)送請求消息,為保證B收到請求,?若B不在線,則將請求保存到B的未讀文件中,在其上線時讀取自身信息時(服務(wù)器在發(fā)送完溫度消息后刪除該消息),在通知B,若B在線則直接向其發(fā)送消息。B接收請求,選擇分組,刷新界面,同時向服務(wù)器發(fā)送消息,服務(wù)器在保存信息,同時通知A結(jié)果,A在選擇分組,刷新界面,再將結(jié)果發(fā)到服務(wù)器保存。

?

就是將客戶端的一切改動都發(fā)到服務(wù)器保存下來。做修改個人信息的功能的時候,比如修改昵稱,簽名,密碼等也是一樣的

過程。

5.好友上下線提醒

?

 我覺得這個功能的實現(xiàn)是這個項目最有價值的地方。采用了觀察者模式。

?? 具體做法如下:

?? 自定義一個接口MsgListener,含有方法ReceiveMsgAction(Msg msg);

 自定義一個接口subject,含有方法addMsgListener(MsgListener l),removeMsgListener(MsgListener l),

??? fireMsgListener(Msg msg);

??? 客戶端的通信線程類ClientThread繼承Subject

????定義類MyJTree_AsListeber extends JTree implements MsgListener ,重載ReceiveMsgAction(Msg msg),創(chuàng)建對象時,將之注冊到對應(yīng)的通信線程上。當對應(yīng)通信線程類對象調(diào)用fireMsgListener(Msg msg)時,通知JTree對象作出相應(yīng)顯示刷新。

?

??? 之前我一直都很追求外觀,可當老師第一次講到設(shè)計模式的時候,我才意識到純粹的最求外觀是沒什么意義的,最重要的還是程序的結(jié)構(gòu),一個好的軟件的設(shè)計應(yīng)該是多種結(jié)構(gòu)的綜合,結(jié)構(gòu)的好壞決定了程序的拓展性和可維護性。至于技術(shù)點,最好是能讀懂源碼,理解原理,這需要經(jīng)驗,現(xiàn)在的我還差得遠,對于技術(shù)只停留在用的階段,還未上升到理論。

?

?

6.聊天界面

?

?視頻語音截圖震動功能都沒實現(xiàn)

可以修改字體屬性,傳送消息,文件。未保存消息


? Socket通信小項目--大山QQ(簡易版本)附源碼

?

?

?

?

震動的具體原理就是setLocation(x,y)方法的運用

截圖,遠程就是Robot類的應(yīng)用

視頻功能需要JMF的相關(guān)知識,還沒有研究?

?

7.傳送文件

?

?流程如下:1.在線文件的傳送????? 先發(fā)送請求,對方同意后,開啟一個服務(wù)器(有堵塞,應(yīng)該放在線程中),回發(fā)給發(fā)送者,然后發(fā)送者連上該服務(wù)器,開啟多個線程(我開啟的是2個線程),分段傳送文件,具體實現(xiàn)是RandomAccessFile類。

如DataImputStream類對象只能從文件的第一個字節(jié)開始讀,但RandomAccessFile類對象可以隨機讀取文件,調(diào)用seek(x),或者skipBytes(X)方法,改變指針位置,就可以實現(xiàn)隨機讀取某一位置的字節(jié)。迅雷下載就是這種原理。開始,不清楚seek(x),或者skipBytes(X)方法是如何改變文件指針的,是讀取X個字節(jié)再丟掉,還是直接改變指針在內(nèi)存中的地址呢?經(jīng)過測試,答案是后者。?? 2.離線文件的傳送???? 由于只有一個通信I/o,傳送文件應(yīng)該另外創(chuàng)建Socket對象連上服務(wù)器,發(fā)送完文件后再關(guān)閉Socket。

?

?

?

?

?項目的不足

1.數(shù)據(jù)的存儲??? 文件存儲終究不如數(shù)據(jù)庫存儲,讀取速度慢,性能低。只適合小群體的聊天

2.結(jié)構(gòu)???? 雖然嘗試使用了觀察者模式,但客戶端程序的耦合度還是比較高的,一個好的結(jié)構(gòu)應(yīng)該是多種設(shè)計模式的綜合

3.功能???? 功能比較少,而且有缺陷,比如還沒有加上遠程,視頻等功能,前幾天已經(jīng)把遠程寫好了,不過對圖像的壓縮度

????????????? 感到不滿意,其他功能的細節(jié)也有待改進,比如在添加好友時,我沒有先判斷是否請求對象已是自身好友等,都

????????????? 是些細節(jié)的地方,還有修改個人信息的功能等等,這是都不難,但這些細節(jié)都決定著項目的友好性。很重要。

4.有一個問題沒有解決,好友查找界面,表格刷新時會包空指針的錯,沒找到具體原因。

5.代碼的結(jié)構(gòu)不是很好,注解寫的少了

6.沒有創(chuàng)新?????? 純粹是技術(shù)的練習(xí),嘗試使用了一個設(shè)計模式,沒有創(chuàng)新,沒什么價值

?

收獲

1.意識到結(jié)構(gòu)和友好的重要性

2.在調(diào)試的過程中,第一次意識到Java程序?qū)ο到y(tǒng)內(nèi)存,CPU的占用問題,意識到了一些小問題,比如讀寫文件不關(guān)流的話,就不會釋放內(nèi)存。

3.讓我的心情很平靜,不再浮躁

?

注:項目中的所有圖片都是截圖截下來的,在壓縮包的圖片文件夾中。

Socket通信小項目--大山QQ(簡易版本)附源碼


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久精品国产只有精品6 | 久久精品国产99久久无毒不卡 | 亚州一级毛片 | 国产亚洲欧洲精品 | 中文字幕一区婷婷久久 | 免费的拍拍视频在线观看 | 亚洲天堂一区 | 日韩新片王 | 超97在线观看精品国产 | 国产精品伦一区二区三级视频 | 日韩一区二区久久久久久 | 色综合久久久久久 | 亚洲精品综合欧美一区二区三区 | 亚洲视频一区二区在线观看 | 国产综合久久 | 九一国产 | 亚洲综合日韩在线亚洲欧美专区 | 国产一在线精品一区在线观看 | 国产精品免费_区二区三区观看 | 在线免费观看中文字幕 | 老司机福利在线播放 | 久草手机视频在线 | 中文字幕一区二区视频 | 日本波多野结衣字幕久久 | 亚洲欧美极品 | 国内第一永久免费福利视频 | 九九国产精品九九 | 日韩视频免费在线播放 | 在线欧美精品国产综合五月 | 久久亚洲精品中文字幕二区 | 中文亚洲字幕 | 亚洲视频一区二区在线观看 | 欧美日韩一区二区不卡三区 | 国产免费人视频在线观看免费 | 久久在线中文字幕 | 青青青在线视频 | 一亚洲精品一区 | 国产精品天干天干 | 天天综合天天 | 欧美精品中文字幕手机免费视频 | 天天操天天插天天射 |