服務器橋接改造實現

一、環形緩衝區

環形緩衝區就是一個環形的東西,裏面的數據頭、尾結合在一起,形成了環形緩衝區。環形緩衝區有一個特點,當一個數據元素被刪掉之後,其餘的元素不需要移動它的位置。同時,它滿足先進、先出的規則,緩衝區比較適合最開始確定的一個最大容量的情況下,那麼,往裏面填充數據,最終讀取數據的過程。

在橋接模式中,需要把數據接收下來,然後再發送到另一個客戶端。但是,由於同時存在接收和發送,而發送和接收是兩個不同的連接,它的發送速度和接收速度不一定相同,此時需要這樣一個緩衝區,做一個同步的操作。當接收速度遠遠大於發送速度的時候,將數據接收到緩衝區當中,等待它一點點地發送。同時,爲了避免重複地去覆蓋該內容,我們採用環形緩衝區的方式,用來維護整個數據集合。

這張圖代表了在環形緩衝區中填充了部分數據的情況,從Head一直填充到了Tail的位置。環形緩衝區在內存中並不是一個環形的,它只是一個數組或是一個鏈表,鏈表是一個可以隨時擴充環形緩衝區的容量雙向或單向鏈表,常見的是用數組來表示。之所以說它是環形緩衝區,是從邏輯上來說的

 

二、環形緩衝區的結構

準備開始讀寫

寫數據:

讀數據:

 

讀數據到末尾:

繼續讀取數據,覆蓋原來的數據:

 

如果再繼續寫入數據,當End和Start相等時,代表整個緩衝區是空的,此時,該如何解決這個問題呢?將其中一個存儲座標不存儲數據,當寫數據的時候,永遠寫到當前讀座標的後面一位,也就是說讀座標後面一位永遠不寫入數據。

 

二、類

CircularByteBuffer : 環形緩衝區

BufferOverflowException : 緩衝區所產生的異常

BridgeSocketDispatcher : 橋接分發的Dispatcher

AudioRoom : 房間的基本封裝

三、橋接原理

在橋接原理當中,首先是有兩個客戶端,也就是A連接和B連接,兩個連接都有一個發送和接收,發送和接收代表了我們的輸出和輸入流。

此時,在A連接上啓動橋接模式,在啓動的時候,會啓動一個A BridgeSocketDispatcher,也就是橋接的調度器。當橋接的調度器初始化的時候,需要將A連接的Receiver傳遞進去,也就是當前的Bridge本身就依賴了當前A連接的接收者。同樣的,B也啓動這樣的橋接模式,在啓動的時候,同樣也會啓動B的橋接調度器,同樣也持有了B連接的接收者。

那應該怎麼做,才能完成整個的橋接過程呢?把B的發送者添加到A的橋接當中去,這樣,在A的橋接調度器中就持有了A的接收者和B的發送者。同理,可以對B做相同的處理。

此時,雙方互相是一個交叉的關係。當在A的BridgeSocketDispatcher中接收數據時,接收到數據會放到環形緩衝區,在環形緩衝區中的內容會緩衝起來,然後再通過B的sender進行發送。這樣就實現了將A連接的數據發送給了B連接。同樣,在B的BridgeDispatcher中也進行同樣的操作,將B接收到的數據通過A的sender發送出去。

 

四、服務器橋接改造難點

 

五、客戶端按順序添加的處理鏈

 

六、綁定連接

七、創建房間

八、移除房間

九、加入房間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章