91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Apache MINA (3) NioSocketAcceptor初始化

發布時間:2020-06-07 15:37:54 來源:網絡 閱讀:5024 作者:阿里中間件 欄目:移動開發

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

服務端通過創建一個NioSocketAcceptor來接受請求,客戶端通過創建NioSocketConnector來連接服務端并發送請求,從整體的體系結構來看二者的關系。

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

首先從服務端的NioSocketAcceptor開始:

1.NioSocketAcceptor的父類為AbstractPollingIoAcceptor,很多實現是在父類中實現的。在構造此類的時候,同時也構造了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,個數為cpu個數+1,為每個IoProcessor初始化一個默認的Excutor

this.executor=Executors.newCachedThreadPool();

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

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

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

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

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

實現IoHandlerAdapter來處理客戶的請求。

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

調用startupAcceptor()負責初始化內部線程類Acceptor,Acceptor主要負責輪詢處理注冊過連接事件的請求建立起連接,即整個監聽的主線程,Acceptor會開一個Selector,用來監聽NIO中的ACCEPT事件,調用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);

當接收到請求時調用accept()方法法處理接收連接,把SocektChannel綁定到NioSession中

Java代碼
當接收到請求時調用accept()方法法處理接收連接,把SocektChannel綁定到NioSession中
Java代碼

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

Java代碼
selector.wakeup();

小結:

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

浪卡子县| 清新县| 筠连县| 丽江市| 庆城县| 焦作市| 瓦房店市| 岳池县| 九江县| 兰州市| 彰化市| 巩义市| 祁连县| 通榆县| 丹寨县| 望奎县| 萍乡市| 定安县| 白沙| 乌海市| 二连浩特市| 北票市| 灌云县| 阳西县| 应城市| 奉新县| 齐河县| 浠水县| 肥西县| 定兴县| 仁布县| 乐安县| 四子王旗| 石泉县| 卫辉市| 西乌珠穆沁旗| 永安市| 手游| 栾川县| 平定县| 诸城市|