這一小節,我們來學習一下如何使用 netty 來啟動乙個服務端應用程式,以下是服務端啟動的乙個非常精簡的 demo:
public
class
nettyserver})
; serverbootstrap.
bind
(8000);
}}
我們的最小化引數配置到這裡就完成了,我們總結一下就是,要啟動乙個netty服務端,必須要指定三類屬性,分別是執行緒模型、io 模型、連線讀寫處理邏輯,有了這三者,之後在呼叫bind(8000),我們就可以在本地繫結乙個 8000 埠啟動起來,以上這段**讀者可以直接拷貝到你的 ide 中執行。
在上面**中我們繫結了 8000 埠,接下來我們實現乙個稍微複雜一點的邏輯,我們指定乙個起始埠號,比如 1000,然後呢,我們從1000號埠往上找乙個埠,直到這個埠能夠繫結成功,比如 1000 埠不可用,我們就嘗試繫結 1001,然後 1002,依次類推。
serverbootstrap.bind(8000);這個方法呢,它是乙個非同步的方法,呼叫之後是立即返回的,他的返回值是乙個channelfuture,我們可以給這個channelfuture新增乙個***genericfuturelistener,然後我們在genericfuturelistener的operationcomplete方法裡面,我們可以監聽埠是否繫結成功,接下來是監測埠是否繫結成功的**片段。
serverbootstrap.
bind
(8000).
addlistener
(new
genericfuturelistener
?super void>>()
else}}
);
我們接下來從 1000 埠號,開始往上找埠號,直到埠繫結成功,我們要做的就是在 if (future.issuccess())的else邏輯裡面重新繫結乙個遞增的埠號,接下來,我們把這段繫結邏輯抽取出乙個bind方法。
private
static
void
bind
(final serverbootstrap serverbootstrap,
final
int port)
else}}
);}
以上就是自動繫結遞增埠的邏輯,接下來,我們來一起學習一下,服務端啟動,我們的引導類serverbootstrap除了指定執行緒模型,io 模型,連線讀寫處理邏輯之外,他還可以幹哪些事情?
serverbootstrap.
handler
(new
channelinitializer
()})
handler()方法呢,可以和我們前面分析的childhandler()方法對應起來,childhandler()用於指定處理新連線資料的讀寫處理邏輯,handler()用於指定在服務端啟動過程中的一些邏輯,通常情況下呢,我們用不著這個方法。
serverbootstrap.
attr
(attributekey.
newinstance
("servername"),
"nettyserver"
)
**attr()**方法可以給服務端的 channel,也就是nioserversocketchannel指定一些自定義屬性,然後我們可以通過channel.attr()取出這個屬性,比如,上面的**我們指定我們服務端channel的乙個servername屬性,屬性值為nettyserver,其實說白了就是給nioserversocketchannel維護乙個map而已,通常情況下,我們也用不上這個方法。
那麼,當然,除了可以給服務端 channel nioserversocketchannel指定一些自定義屬性之外,我們還可以給每一條連線指定自定義屬性。
serverbootstrap.
childattr
(attributekey.
newinstance
("clientkey"),
"clientvalue"
)
上面的childattr可以給每一條連線指定自定義屬性,然後後續我們可以通過channel.attr()取出該屬性。
serverbootstrap
.childoption
(channeloption.so_keepalive,
true).
childoption
(channeloption.tcp_nodelay,
true
)
childoption()可以給每條連線設定一些tcp底層相關的屬性,比如上面,我們設定了兩種tcp屬性,其中
除了給每個連線設定這一系列屬性之外,我們還可以給服務端channel設定一些屬性,最常見的就是so_backlog,如下設定
serverbootstrap.
option
(channeloption.so_backlog,
1024
)
表示系統用於臨時存放已完成三次握手的請求的佇列的最大長度,如果連線建立頻繁,伺服器處理建立新連線較慢,可以適當調大這個引數 社群服務端啟動流程
1.mongod 啟動mongodb伺服器 2.redis server 啟動redis server服務 3.進入cpassport2目錄 rails s 預設3000埠啟動cpassport 4.進入idea目錄 padrino s p 3002 3002埠啟動社群 5.padrino rake...
Eureka原始碼手撕分析啟動流程(服務端)
該註解包含了如下內容 其中 import eurekaservermarkerconfiguration.class 現在怎麼下手,上面的 已經結束了。經過查詢資料發現入口 在jar spring cloud netflix eureka server 2.2.2.release.jar的manif...
HTTP服務端JSON服務端
最後更新日期 2014 5 18 author kagula 內容簡介 cppcms是個開源web開發框架,通過它可以很容易實現http服務和json服務,這裡介紹cppcms開發環境的搭建。寫乙個cppcms測試程式,它建立http服務,向瀏覽器返回hello,world頁面。cppcms依賴的一...