天天看點

開源一個基于nio的java網絡程式

   因為最近要從公司離職,害怕用nio寫的網絡程式沒有人能看懂(或許是因為寫的不好吧),就調整成了mina(這樣大家接觸起來非常友善,即使沒有socket基礎,用起來也不難),是以之前基于nio寫的網絡程式就開放出來好了!

      寫的比較挫,大家見諒!

      首先是pollserver類,主要處理select,做網絡事件的監聽和基于futuretask的資料發送,代碼如下:

    主要函數: listen();作用:基于網絡事件處理接受新連結和消息的接收! 

      下面是clienthandle類的代碼,做每個連接配接的處理,比如拆包分包,代碼如下

    重要的幾個函數:  send(bytebuffer data) 将發送處理包裝成futuretask,投遞到pollserver中進行處理,就是pollserver::processoutput中處理

                                handleread() 這裡處理接受資料事件,做了拆包,将二進制資料,按照 長度-内容 的格式進行解析,拆分成一個個bytebuffer(定義見下文)包,然後進行處理。

       clienthandle繼承自isession接口,其實這個無所謂,大家可以自己定義。我這裡因為要和之前的系統相容,是以才繼承了這個。這裡一不小心居然用到了擴充卡模式,我以為這輩子隻會用到建立者模式呢? 個人還是覺得,這些設計模式還是為了解決問題用到的,而不是為了多變的需求而想太多用到的;設計模式用得多用的頻繁,反而增加代碼的可讀性!

       最後看下writetask的封裝

  這個就不多解析了!

      缺陷1: 沒有做空閑連接配接的處理,後來的mina庫,提供了這個功能!有興趣的同學自己寫個吧!

      缺陷2: 自定義的消息包,用了bytebuffer類,和nio提供的bytebuffer 重複!

      給出自定義的bytebuffer的處理:

      相應的bytekit類代碼:

       使用方法:

    可能調整成mina庫,還有其他的一個原因,就是在伺服器端會無辜收到一個rst辨別導緻伺服器斷開。起初以為是代碼問題,後來經過很長時間的排查和咨詢,發現伺服器用的是南方電信的網絡,而一些北方網通的用戶端在通路的時候,就會随機出現rst 連接配接複位現象!查詢了好久,最後還是運維的大哥給的思維!當然在起初解決這個問題的時候,我還是本着代碼的問題;順便還去專門研究了tcp/ip協定詳解,翻出了大學裡面學的計算機網絡這本書。無論如何解決了就好!歡迎拍磚!