Posted on 2006-03-09 02:07
大大毛 閱讀(483)
評論(0) 編輯 收藏 所屬分類:
JAVA
前言:
??????? 這是去年來廣州找工作之前寫的,預備在應聘時當磚頭拿出來。結果沒得逞,好象人家只要看看編程風格就行了
。不過全部是自己寫的(從頭到腳),結構也是自己想著去設計的,里面有很多東西,經常都可以拿出來借鑒一下子.用處也算不小。
簡介如下:
開發環境:Win2k+JDK1.4.2
開發工具:Eclipse3.0
數據環境:
??????? access+軟連接池,演示時容易沙
開發者:
??????? 個人,原本是3個人想著學點東西,結果沒曾想那兩個兄弟覺得麻煩了,一個寫了不到200行的SOCKED通信,一個寫了N小的聊天室.
功能:
??????? 能夠實現用戶注冊,登錄,查找(3種方式,跟當年的QQ學的),聊天以及好友的上/下線提示等...
使用注意:
??????? 一定要記得配數據源,ZIP包中有說明的。不然無法工作。
結構說明:
??????? 這個得要好好說一下,畢竟是心血嘔作啊。看看Socket的工作方式,就是服務端用serversocket在指定端口偵聽,客戶端向此端口連接,一旦成功,則serversocket從阻塞狀態中恢復,產生一個socket對象與之對應。結果產生的就是Socket的一對一(在QQ群上聽見人說Socket可以一對多,不曉得咋整)。圖示如下:
????????ICQ示意圖
??????? 其中客戶端與服務端都是一樣的Socket對象,可以封成一個類,把輸入偵聽也封進去(它與其它的對象完全無關),輸出留下一個接口,這個類我叫它"Linker",然后作為ICQ,每個客人當然是有ID和圖標/性別等信息的,我把它放入"ClientInfo"類,這個類實際上就是一個JavaBean,這樣與數據庫打交道時就比較好用了。在這兩個類的上一層我提供了一個"Client"再次封了一下,它的最大用途是用于與消息分發器打交道,讓它持有一個消息分發器的引用,這個類并保留了Linker的輸出接口便于消息處理器調用。為了實現Linker收到消息時通知Client,我使用了觀察者模式,讓Linker實現Observable接口,而Client繼承至Observer.這樣通訊的線路方面就搞定了。
??????? 在Client對象的管理上,為了便于分組(QQ不也提供好友之類的么)。我提供了一個ClientGroup類來放Client,提供兩個實例(已登錄/未登錄)來分開放,感覺上好一些。由于消息處理上經常需要調用Client對象,把這個功能拿出來專門封在一個類中,我叫它"ClientMangager"來管理那群滑頭的Client
。
??????? 然后到重要的消息處理上了,做了一個"MessageProcessor"的接口,讓消息分發器"ServerMessageProcessor"和針對具體情況的消息處理器都實現這個接口,由于ICQ的通訊是實時也是多對多的,只能采用隊列+先進先出的方式,這樣想來可以處理一些狀況了。分發器中持有一個HashMap,Key放上消息號,Value放上處理器的引用。由控制器來關心如何去搭配好了。這樣的考慮就是,如果后期有興趣增加ICQ的功能,如傳輸文件/圖片等,就比較簡單了,加一個消息號,加一個消息處理器,在控制器中向消息分發器添加一個注冊即可。感覺上這是個么事模式之類的,呵呵。
????? 服務端這邊還剩一個端口偵聽和數據處理了,端口偵聽用了一個"PortListener",我把它放在common包中,原來打算是客戶端那邊以后實現客戶/客戶交互的時候也能夠用上。數據處理上用上學校里的例子,有例子好啊改改就成自己的了
。數據存取上為圖方便采取的是直接對象存取(C++學習時的大禁啊),不管它了,反正能用,不過遺留下了隱患,一旦改動了一下類,就讀不出來了。
????? 服務端這邊最后再上一個"Server"做為控制器,讓它持有PortListener、ServerMessageProcessor、ServerClientManger,還是老套路用觀察者模式與PortListener掛上勾。服務端OK。
????? 再到非常非常重要的消息上,消息是多種多樣的,每一個消息對應一個功能,來一個接口好了"Message",該接口中還放上了消息號(final)這樣編寫的時候也就簡單直觀得多了。
????? 到此,時間已經過去N久,開始客戶端編程,客戶端是要來上幾個窗體的,麻煩啊。根據功能分成多個JPanel/JFrame了,如登錄窗口,顯示聊天的面板,輸入+發送面板,好友顯示的面板,還有查找好友。。。總之耐心快沒了。最后還是栽在了那個好友面板上,那個JList是個痛,我用上了ListCellRender渲染器,這個渲染器說實話還是蠻成功的,但是整到JList中就不賊,在單類的Main中演示都是好的。但是在最后的成果上就時靈時不靈,經常都會出現JList白板一塊的問題(完全隨機啊
)。后來思考了一下,懷疑是在構造函數中調用太多東西的緣故,所以下載的朋友最后多試幾次我保證能OK,我咳。
????? 東西說得蠻多了,至此為止,眼見為實。
拜托:
??????? 有研究的朋友能整好那個JList顯示的問題,萬望告之。。。。
如實告之:
?????? Server這邊是先寫的,比較有耐心,Client那邊是先來寫的,耐心沒了,要評論的朋友多看看Server,好多留個面子
下載:
????? MyICQ.zip