關於使用nio實現廣播數據給所有已連接客戶端

        NIO基礎學完了,NIO學會不難,但是能達到實際做項目的地步還是需要花很大的精力和時間來專研的,若不能非常熟練使用NIO,那麼NIO對你來說就是一個坑,你會發現辛辛苦苦寫完的程序會出現各種問題,特別是在較大併發、較大數據量時,問題會非常的明顯。

        之前寫的一遍博客《Java NIO實戰之聊天室》,這個小程序其實是有問題的,在低併發的情況下可以較好的運行,但是在很多客戶端同時連接服務器的高併發情況下就會出現問題,目前經過測試在很多客戶端同時連接服務器時會拋出ConcurrentModificationException。其原因是在遍歷已註冊鍵時,有客戶端連接修改了Selector的已註冊鍵集合。這幾天我也一直在思考如何解決這個問題,但是一直沒想到一個自覺非常完美的解決方案,在網上也找了很多文章看,但很難找到答案。目前自己能夠想到的方案就是單獨維護客戶端通道的Map,並對這個Map同步,當有客戶端連接時,先對這個Map加鎖,然後將客戶端SocketChannel加入這個Map,若無法獲得鎖就等待;當遍歷這個Map進行轉發消息時,也先對這個Map加鎖。感覺這樣做是一種非常低性能和比較笨的辦法。但是到現在也沒有找到一個非常好的解決方法,可能是對NIO理解的還不夠深入,還需苦逼專研。

        爲了不浪費時間,NIO我先放一邊,雖然對NIO還沒有達到運用的非常熟練的地步,但是基本用法及核心類API都瞭解的非常清楚了。現在開始學習netty,希望能用netty從尋得啓發。網上都說現在用java開發網絡程序首選netty,因爲netty封裝的好用、性能高、社區活躍,之前面試了2家遊戲公司,他們在項目中也是用的netty,決定專研netty。netty學會了,希望能堅持下去再學學mina。技術人得有技術人應有的態度,呵呵。

發佈了32 篇原創文章 · 獲贊 11 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章