成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

ApacheMINA(3)NioSocketAcceptor初始化

上一篇博客ApacheMINA(2)HelloWorld!以一個(gè)例子實(shí)現(xiàn)了mina客戶端和服務(wù)端的通訊,現(xiàn)在通過源碼來了解建立連接和通訊的過程(基于tcp/ip的實(shí)現(xiàn))。

成都創(chuàng)新互聯(lián)公司主營雙牌網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,App定制開發(fā),雙牌h5微信平臺小程序開發(fā)搭建,雙牌網(wǎng)站營銷推廣歡迎雙牌等地區(qū)企業(yè)咨詢

服務(wù)端通過創(chuàng)建一個(gè)NioSocketAcceptor來接受請求,客戶端通過創(chuàng)建NioSocketConnector來連接服務(wù)端并發(fā)送請求,從整體的體系結(jié)構(gòu)來看二者的關(guān)系。

IoService是對于服務(wù)器端接受連接和客戶端發(fā)起連接兩類行為的一個(gè)抽象。IoServer用來執(zhí)行真正的I/O操作,以及管理I/O會話。兩個(gè)子接口為IoAcceptor和IoConnector。IoAcceptor用來接受連接,與客戶端進(jìn)行通訊。IoConnector用來發(fā)起連接,與服務(wù)端進(jìn)行通訊。IoAcceptor和IoConnector都分別有基于TCP/IP協(xié)議協(xié)議,UDP/IP協(xié)議以及虛擬機(jī)管道通訊的子接口。HelloWorld例子里面實(shí)現(xiàn)的是基于TCP/IP協(xié)議的通訊,用了mina默認(rèn)的實(shí)現(xiàn)類NioSocketAcceptor和NioSocketConnector。

首先從服務(wù)端的NioSocketAcceptor開始:

1.NioSocketAcceptor的父類為AbstractPollingIoAcceptor,很多實(shí)現(xiàn)是在父類中實(shí)現(xiàn)的。在構(gòu)造此類的時(shí)候,同時(shí)也構(gòu)造了NioProcessor類

NioSocketAcceptor
Java代碼
public NioSocketAcceptor() {
        super(new DefaultSocketSessionConfig(), NioProcessor.class);
        ((DefaultSocketSessionConfig) getSessionConfig()).init(
}
AbstractPollingIoAcceptor

Java代碼

protected AbstractPollingIoAcceptor(IoSessionConfig sessionConfig,
            Class<? extends IoProcessor<S>> processorClass) {
        this(sessionConfig, null, new SimpleIoProcessorPool<S>(processorClass),
                true);
}
SimpleIoProcessorPool

Java代碼

private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1;
……
public SimpleIoProcessorPool(Class<? extends IoProcessor<S>> processorType) {
        this(processorType, null, DEFAULT_SIZE);
}

初始化NioProcessor,個(gè)數(shù)為cpu個(gè)數(shù)+1,為每個(gè)IoProcessor初始化一個(gè)默認(rèn)的Excutor

this.executor=Executors.newCachedThreadPool();

初始化cpu+1個(gè)放到privatefinalIoProcessor<S>[]pool中,用來處理NioSession,所以S為NioSession

Java代碼
public final class NioProcessor extends AbstractPollingIoProcessor<NioSession>…

2.初始化完SimpleIoProcessorPool,回到AbstractPollingIoAcceptor的構(gòu)造方法中,調(diào)用NioSocketAcceptor中的init()方法打開selector通道,完成NioSocketAcceptor的構(gòu)造。

3.然后在上一篇HelloWorld的例子中設(shè)置了SocketSessionConfig的readBufferSize;

接收數(shù)據(jù)的過濾器,例子中設(shè)置的是TextLineCodecFactory(按照行一行為一個(gè)單位讀取數(shù)據(jù));

實(shí)現(xiàn)IoHandlerAdapter來處理客戶的請求。

4.最后執(zhí)行acceptor.bind(newInetSocketAddress(SERVER_PORT)),指定服務(wù)提供綁定的端口,同時(shí)執(zhí)行AbstractPollingIoAcceptor中的bindInternal方法,

調(diào)用startupAcceptor()負(fù)責(zé)初始化內(nèi)部線程類Acceptor,Acceptor主要負(fù)責(zé)輪詢處理注冊過連接事件的請求建立起連接,即整個(gè)監(jiān)聽的主線程,Acceptor會開一個(gè)Selector,用來監(jiān)聽NIO中的ACCEPT事件,調(diào)用NioSocketAcceptor中的open()方法來打開NIO的socketChinal
Java代碼
……
ServerSocketChannel channel = ServerSocketChannel.open();
……

然后配制socket的一些基本屬性,并注冊此事件是可連接的事件

Java代碼
// This is a non blocking socket channel
       channel.configureBlocking(false);

       // Configure the server socket,
       ServerSocket socket = channel.socket();

       // Set the reuseAddress flag accordingly with the setting
       socket.setReuseAddress(isReuseAddress());

       // and bind.
       socket.bind(localAddress, getBacklog());

       // Register the channel within the selector for ACCEPT event
       channel.register(selector, SelectionKey.OP_ACCEPT);

當(dāng)接收到請求時(shí)調(diào)用accept()方法法處理接收連接,把SocektChannel綁定到NioSession中

Java代碼
當(dāng)接收到請求時(shí)調(diào)用accept()方法法處理接收連接,把SocektChannel綁定到NioSession中
Java代碼

綁定完成后喚醒NIO的selector開始接收請求

Java代碼
selector.wakeup();

小結(jié):

通過解析NioSocketAcceptor的構(gòu)造方法,bind()等代碼大概了解了mina服務(wù)端初始化相關(guān)的一些信息,同時(shí)涉及了mina框架相關(guān)的IoProcessorIoSessionIoServiceListener等,在下一篇文章中會再做進(jìn)一步的分析接收到最終的處理請求的過程。

網(wǎng)頁標(biāo)題:ApacheMINA(3)NioSocketAcceptor初始化
當(dāng)前路徑:http://jinyejixie.com/article28/jjeecp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站制作用戶體驗(yàn)、品牌網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
新竹市| 双鸭山市| 芮城县| 九龙城区| 朝阳市| 会昌县| 平湖市| 教育| 郁南县| 巢湖市| 丰宁| 夏河县| 开封市| 贡山| 大竹县| 肇东市| 泸州市| 太保市| 土默特左旗| 鹤壁市| 海南省| 镇坪县| 阿拉善右旗| 渭源县| 永清县| 庄河市| 德清县| 闻喜县| 建湖县| 芮城县| 五河县| 绥中县| 古交市| 广东省| 章丘市| 焉耆| 同心县| 郧西县| 宜兴市| 株洲市| 积石山|