Netty实战 IM即时通讯系统(四)服务端启动流程
##
Netty實(shí)戰(zhàn) IM即時(shí)通訊系統(tǒng)(四)服務(wù)端啟動(dòng)流程零、 目錄
- Netty 簡介
- Netty 環(huán)境配置
- 服務(wù)端啟動(dòng)流程
- 實(shí)戰(zhàn): 客戶端和服務(wù)端雙向通信
- 數(shù)據(jù)傳輸載體ByteBuf介紹
- 客戶端與服務(wù)端通信協(xié)議編解碼
- 實(shí)現(xiàn)客戶端登錄
- 實(shí)現(xiàn)客戶端與服務(wù)端收發(fā)消息
- pipeline與channelHandler
- 構(gòu)建客戶端與服務(wù)端pipeline
- 拆包粘包理論與解決方案
- channelHandler的生命周期
- 使用channelHandler的熱插拔實(shí)現(xiàn)客戶端身份校驗(yàn)
- 客戶端互聊原理與實(shí)現(xiàn)
- 群聊的發(fā)起與通知
- 群聊的成員管理(加入與退出,獲取成員列表)
- 群聊消息的收發(fā)及Netty性能優(yōu)化
- 心跳與空閑檢測
- 總結(jié)
- 擴(kuò)展
###四、 服務(wù)端啟動(dòng)流程
服務(wù)端Demo
public class NettyServer {public static void main(String[] args) {NioEventLoopGroup bossGroup = new NioEventLoopGroup(1);NioEventLoopGroup workerGroup = new NioEventLoopGroup();ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<NioSocketChannel>() {protected void initChannel(NioSocketChannel ch) {}});serverBootstrap.bind(8000);}}到這里我們最小化參數(shù)配置就完成了 , 總結(jié)一下 , 想要啟動(dòng)一個(gè)Netty服務(wù)端 , 我們需要指定三個(gè)類屬性:線程模型、 IO模型、處理邏輯 , 有了這三者之后再調(diào)用 bind(8000) , 我們就可以在本地綁定一個(gè)8000端口啟動(dòng)起來 。
自動(dòng)綁定遞增端口
在上面代碼中我們直接綁定了8000端口 , 接下來我們實(shí)現(xiàn)一個(gè)稍微復(fù)雜的邏輯: 我們指定一個(gè)起始端口 , 比如:1000 , 然后判斷是否綁定成功 , 如果不成功就 綁定1001 , 直到成功為止。
serverBootStrap.bind() 這個(gè)方法時(shí)異步的 , 調(diào)用之后立即返回結(jié)果 , 但是并不知道是否綁定成功, 他的返回值是一個(gè)ChannelFuture , 我們可以給這個(gè)ChannelFuture 添加一個(gè)監(jiān)聽器 GenericFutureListener , 然后我們?cè)贕enericFutureListener 的operationComplete 方法里面 , 我們可以監(jiān)聽到端口是否綁定成功 , 接下來是檢測端口是否綁定成功的代碼:
/**
-
自動(dòng)遞增綁定有效端口
-
@author outman
-
*/
private static void bind(ServerBootstrap serverBootstrap, int port) {serverBootstrap.bind(port).addListener(new GenericFutureListener<Future<? super Void>>() {
@Overridepublic void operationComplete(Future<? super Void> future) throws Exception {if(future.isSuccess()) {System.out.println("成功綁定端口:"+port);}else {System.out.println("綁定端口失敗:"+ port);bind(serverBootstrap, port+1);}}});
}
執(zhí)行結(jié)果: (我的mysql 占用了3306端口 , 所以3306綁定失敗)
綁定端口失敗:3306
成功綁定端口:3307
服務(wù)端啟動(dòng)相關(guān)的其他方法
handler(): handler() 方法可以和之前分析的childHandler() 對(duì)應(yīng)起來 ,childHandler() 用于指定處理新連接數(shù)據(jù)的業(yè)務(wù)邏輯 , handler用于指定服務(wù)端啟動(dòng)過程中的一些邏輯
serverBootstrap.handler(new ChannelInitializer<NioServerSocketChannel>() {@Overrideprotected void initChannel(NioServerSocketChannel ch) throws Exception {System.out.println("服務(wù)端啟動(dòng)中..."); }});attr(): attr()方法可以給服務(wù)端的channel , 也就是NioServerSocketChannel指定一些自定義屬性 , 然后我們可以通過channel.attr()取出這個(gè)屬性 , 比如 , 我們可以給服務(wù)端channel指定一個(gè)serverName 屬性 , 屬性值NettyServer , 其實(shí)說白了就是給NioServerSocketChannel維護(hù)了一個(gè)map:
//設(shè)置服務(wù)端屬性serverBootstrap.attr(AttributeKey.newInstance("serverName"), "NettyServer");serverBootstrap.handler(new ChannelInitializer<NioServerSocketChannel>() {@Overrideprotected void initChannel(NioServerSocketChannel channel) throws Exception {// 取出服務(wù)端屬性Attribute<Object> serverName = channel.attr(AttributeKey.valueOf("serverName") );System.out.println( serverName.get()+"服務(wù)端啟動(dòng)中..."); }});childAttr() : 可以通過childAttr 給每一條連接設(shè)置自定義屬性
//給連接設(shè)置自定義屬性serverBootstrap.childAttr(AttributeKey.newInstance("clientName"), "NettyClient");serverBootstrap.childHandler(new ChannelInitializer<NioSocketChannel>() {@Overrideprotected void initChannel(NioSocketChannel childChannel) throws Exception {// 取出連接中的自定義屬性childChannel.attr(AttributeKey.valueOf("clientName"));}});childOption(): childOption方法可以給每條連接設(shè)置一些TCP底層相關(guān)的屬性:
ChannelOption.SO_KEEPALIVE表示是否開啟TCP底層心跳機(jī)制,true為開啟
ChannelOption其他參數(shù)詳解: https://www.cnblogs.com/googlemeoften/p/6082785.html
serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);serverBootstrap.childOption(ChannelOption.SO_BACKLOG, 10);option(): 給服務(wù)端channel 設(shè)置一些屬性:
serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024)//表示系統(tǒng)用于存放已經(jīng)完成三次握手的請(qǐng)求的隊(duì)列的最大長度 , 如果建立連接頻繁, 服務(wù)器處理創(chuàng)建新連接較慢, 可以適當(dāng)調(diào)大這個(gè)參數(shù)。總結(jié)
疑問:
總結(jié)
以上是生活随笔為你收集整理的Netty实战 IM即时通讯系统(四)服务端启动流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Netty实战 IM即时通讯系统(三)N
- 下一篇: Netty实战 IM即时通讯系统(五)客