最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java Socket通信封裝MIna框架

 更新時間:2021年06月07日 08:59:41   投稿:zhanglei  
Mina異步IO使用的Java底層JNI框架,Mina提供服務(wù)端和客戶端,將我們的業(yè)務(wù)解耦開發(fā),真正做到高內(nèi)聚低耦合的思想。

核心類

IoService :Mina中將服務(wù)端和客戶端都看成是服務(wù),這里提供統(tǒng)一接口IoService,這個接口的作用就是用來處理套接字機(jī)制。也正是IoService來監(jiān)聽消息返回消息這些步驟,可以說IoService就是我們Mina中核心

IoProcessor:這個接口在另一個線程上,負(fù)責(zé)檢查是否有數(shù)據(jù)在通道上讀寫,也就是說它也擁有自己的Selector,這是與我們使用JAVA NIO 編碼時的一個不同之處,通常在JAVA NIO 編碼中,我們都是使用一個Selector,也就是不區(qū)分IoService與IoProcessor 兩個功能接口。另外,IoProcessor 負(fù)責(zé)調(diào)用注冊在IoService 上的過濾器,并在過濾器鏈之后調(diào)用IoHandler

IoFilter : 定義了一些攔截器 , 和我們web中攔截器一樣,用來橫向攔截處理一些全局的操作(日志處理,編碼處理)。其中我們必須注意的是加解密消息。作為一個好的框架肯定是有默認(rèn)的攔截器的(TextLineCodecFactory )。默認(rèn)攔截器可以叫消息強(qiáng)制轉(zhuǎn)換為String類型。畢竟String最通用

IoHandler : 這個是我們處理消息的邏輯,前面的攔截器只是在接受是進(jìn)行一些驗(yàn)證、翻譯的功能。拿到數(shù)據(jù)之后我們需要做的事情就是在IoHandler中

各個擊破

IoService

首先我們已服務(wù)端NioSocketAcceptor為列,看看我們的服務(wù)類之間的結(jié)構(gòu)依賴關(guān)系

IoService是服務(wù)的鼻祖,無論在我們看來的服務(wù)端還是客戶端都得繼承它(間接繼承)。在IoService中我們會定義我們消息的處理過濾器(上文的攔截器),消息處理的業(yè)務(wù)類。在上文簡介中我們知道,這一步其實(shí)是IoProcessor來完成,那么IoProcessor在什么出現(xiàn)呢。比如Mina框架中用來創(chuàng)建服務(wù)端類NioSocketAcceptor。他直接繼承了AbstractPollingIoAcceptor。而AbstractPollingIoAcceptor類中根據(jù)參數(shù)創(chuàng)建了我們需要的IoProcessor.從而我們有了IoProcessor就可以執(zhí)行消息間的通信了。

所以過濾器、處理器實(shí)在我們服務(wù)啟動之前配置好的。一旦啟動成功就無法再修改了。我們服務(wù)端NioSocketAcceptor通過bind方法就可以綁定到指定端口上。我們這里的綁定實(shí)現(xiàn)了多態(tài)綁定。我們可以綁定多個服務(wù)。

/**
* {@inheritDoc}
*/
@Override
public final void bind(Iterable<? extends SocketAddress> localAddresses) throws IOException {
    if (isDisposing()) {
        throw new IllegalStateException("The Accpetor disposed is being disposed.");
    }

    if (localAddresses == null) {
        throw new IllegalArgumentException("localAddresses");
    }

    List<SocketAddress> localAddressesCopy = new ArrayList<>();

    for (SocketAddress a : localAddresses) {
        checkAddressType(a);
        localAddressesCopy.add(a);
    }

    if (localAddressesCopy.isEmpty()) {
        throw new IllegalArgumentException("localAddresses is empty.");
    }

    boolean activate = false;
    synchronized (bindLock) {
        synchronized (boundAddresses) {
            if (boundAddresses.isEmpty()) {
                activate = true;
            }
        }

        if (getHandler() == null) {
            throw new IllegalStateException("handler is not set.");
        }

        try {
            Set<SocketAddress> addresses = bindInternal(localAddressesCopy);

            synchronized (boundAddresses) {
                boundAddresses.addAll(addresses);
            }
        } catch (IOException | RuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw new RuntimeIoException("Failed to bind to: " + getLocalAddresses(), e);
        }
    }

    if (activate) {
        getListeners().fireServiceActivated();
    }
}

在上面我們可以看到bind最后是去激活對應(yīng)的監(jiān)聽器。我們一個IoServer處理一個線程中的消息。我們監(jiān)聽器就是監(jiān)聽線程內(nèi)的消息。每一次的綁定都會有不同的監(jiān)聽器、ioSession去專門處理消息之間的通信。我們可以通過IoSession設(shè)置一些請求數(shù)據(jù)完成數(shù)據(jù)的權(quán)限驗(yàn)證。

在服務(wù)創(chuàng)建的時候我們正常需要設(shè)置IoSession的一些配置。通過getSessionConfig方法獲取IoSessionConfig。里面設(shè)置參數(shù)常用如下:

  • setReadBufferSize : 設(shè)置讀取數(shù)據(jù)的緩沖區(qū)大小
  • setMinReadBufferSize: 設(shè)置緩沖區(qū)最大值
  • setMaxReadBufferSize: 設(shè)置緩沖區(qū)最小值
  • setThroughputCalculationInterval: 設(shè)置通道計(jì)算時間 默認(rèn)3s
  • setIdleTime(IdleStatus status, int idleTime): status 設(shè)置是一方還是雙方 , idLetime 是超過多久就會進(jìn)入空閑狀態(tài)
IoAcceptor acceptor=new NioSocketAcceptor();    
acceptor.getSessionConfig().setReadBufferSize(2048);    
acceptor.getSessionConfig.setIdleTime(IdleStatus.BOTH_IDLE,10);

IoFilter

在IoService中有獲取filter鏈的一個方法 DefaultIoFilterChainBuilder getFilterChain() , 我們需要做的就是定義過濾器,然后通過該方法獲取過濾鏈加入到請求鏈上。我們自定義過濾器也很簡單,只需要繼承IoFilterAdapter這個類就好了。

acceptor.getFilterChain().addLast("codec",  new ProtocolCodecFilter(new TextLineCodecFactory( 
Charset.forName("UTF-8"),LineDelimeter.WINDOWS.getValue(),LineDelimiter. WINDOWS.getValue()))    
);    

TextLineCodecFactory 這個類是Mina提供的編解碼工廠,這個工廠的特性是以換行符'\r\n'為結(jié)束通信的標(biāo)志。也就是說如果我們傳遞消息沒有換行符,另外一段會繼續(xù)
接受消息知道接受到'\r\n'才會接受,并把接受到的消息通過編解碼器轉(zhuǎn)到IoHandler層供業(yè)務(wù)層處理。(這里博主被坑在這里了)

IoHandler

到了這一步,我們的通信基本就已經(jīng)完成了。剩下的事情已經(jīng)和Mina基本沒多大關(guān)聯(lián)了。我們將在這里處理業(yè)務(wù)邏輯,使用到的就是Handler提供的接收消息和發(fā)送消息兩個功能。這里我們需要注意的是Handler提供messageReceived和messageSent并不是字面意思。前者就是消息的接受,但是后者并不是消息的發(fā)送。我們常用的發(fā)送消息是session.write方法。

總結(jié)

今天我們了解了Mina工作的流程,主要就是IoFilter和IoHandler實(shí)現(xiàn)消息的通信 。 千里之行始于足下,一點(diǎn)一點(diǎn)的進(jìn)步。下面貼出一份總結(jié)的圖譜幫助我們理解Mina流程

以上就是詳解Java Socket通信封裝MIna框架的詳細(xì)內(nèi)容,更多關(guān)于Java Socket通信封裝MIna框架的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • spring?boot?validation參數(shù)校驗(yàn)與分組嵌套各種類型及使用小結(jié)

    spring?boot?validation參數(shù)校驗(yàn)與分組嵌套各種類型及使用小結(jié)

    參數(shù)校驗(yàn)基本上是controller必做的事情,畢竟前端傳過來的一切都不可信,validation可以簡化這一操作,這篇文章主要介紹了spring?boot?validation參數(shù)校驗(yàn)分組嵌套各種類型及使用小結(jié),需要的朋友可以參考下
    2023-09-09
  • JAVA泛型的繼承和實(shí)現(xiàn)、擦除原理解析

    JAVA泛型的繼承和實(shí)現(xiàn)、擦除原理解析

    這篇文章主要介紹了JAVA泛型的繼承和實(shí)現(xiàn)、擦除原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • 詳解如何給Sprintboot應(yīng)用添加插件機(jī)制

    詳解如何給Sprintboot應(yīng)用添加插件機(jī)制

    這篇文章主要為大家介紹了如何給 Sprintboot 應(yīng)用添加插件機(jī)制,文中有詳細(xì)的解決方案及示例代碼,具有一定的參考價值,需要的朋友可以參考下
    2023-08-08
  • 一文讓你徹底明白Java中的值傳遞和引用傳遞

    一文讓你徹底明白Java中的值傳遞和引用傳遞

    這篇文章主要給大家介紹了關(guān)于Java中值傳遞和引用傳遞的相關(guān)資料,值傳遞是指在調(diào)用函數(shù)時將實(shí)際參數(shù)復(fù)制一份傳遞到函數(shù)中,引用傳遞是指在調(diào)用函數(shù)時將實(shí)際參數(shù)的引用直接傳遞到函數(shù)中,需要的朋友可以參考下
    2023-10-10
  • Idea安裝Eslint插件提示:Plugin NativeScript was not installed的問題

    Idea安裝Eslint插件提示:Plugin NativeScript was not installed的問題

    這篇文章主要介紹了Idea安裝Eslint插件提示:Plugin NativeScript was not installed的問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 實(shí)現(xiàn)java文章點(diǎn)擊量記錄實(shí)例

    實(shí)現(xiàn)java文章點(diǎn)擊量記錄實(shí)例

    這篇文章主要為大家介紹了實(shí)現(xiàn)java文章點(diǎn)擊量記錄實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • IntelliJ IDEA 安裝目錄的核心文件的功能及用法

    IntelliJ IDEA 安裝目錄的核心文件的功能及用法

    這篇文章我們主要講解一下 IntelliJ IDEA 安裝目錄中的一些核心文件的功能及用法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-10-10
  • Java中Arraylist動態(tài)擴(kuò)容方法詳解

    Java中Arraylist動態(tài)擴(kuò)容方法詳解

    ArrayList的列表對象實(shí)質(zhì)上是存儲在一個引用型數(shù)組里的,下面這篇文章主要給大家介紹了關(guān)于Java中Arraylist動態(tài)擴(kuò)容方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • SWT(JFace) 文本編輯器 實(shí)現(xiàn)代碼

    SWT(JFace) 文本編輯器 實(shí)現(xiàn)代碼

    SWT(JFace) 文本編輯器 實(shí)現(xiàn)代碼
    2009-06-06
  • Java JVM調(diào)優(yōu)五大技能詳解

    Java JVM調(diào)優(yōu)五大技能詳解

    這篇文章主要為大家介紹了JVM調(diào)優(yōu)的五大技能,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11

最新評論

高尔夫| 安达市| 双鸭山市| 淮滨县| 西乌| 阿图什市| 浠水县| 珠海市| 宜兰市| 邯郸县| 东乡| 聂拉木县| 肥东县| 南昌县| 井冈山市| 灌阳县| 张家口市| 甘南县| 福清市| 温州市| 霸州市| 个旧市| 龙江县| 湘潭市| 乌恰县| 城步| 谷城县| 奉节县| 砀山县| 迁西县| 云南省| 天气| 二连浩特市| 达州市| 青州市| 陆川县| 左权县| 靖边县| 凭祥市| 全州县| 托克逊县|