午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁技術(shù)文章
文章詳情頁

詳解Java Socket通信封裝MIna框架

瀏覽:202日期:2022-08-11 09:47:47
目錄核心類各個擊破IoServiceIoFilterIoHandler總結(jié)核心類

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

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

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

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

各個擊破IoService

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

詳解Java Socket通信封裝MIna框架

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

詳解Java Socket通信封裝MIna框架

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

/*** {@inheritDoc}*/@Overridepublic 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最后是去激活對應的監(jiān)聽器。我們一個IoServer處理一個線程中的消息。我們監(jiān)聽器就是監(jiān)聽線程內(nèi)的消息。每一次的綁定都會有不同的監(jiān)聽器、ioSession去專門處理消息之間的通信。我們可以通過IoSession設(shè)置一些請求數(shù)據(jù)完成數(shù)據(jù)的權(quán)限驗證。

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

setReadBufferSize : 設(shè)置讀取數(shù)據(jù)的緩沖區(qū)大小 setMinReadBufferSize: 設(shè)置緩沖區(qū)最大值 setMaxReadBufferSize: 設(shè)置緩沖區(qū)最小值 setThroughputCalculationInterval: 設(shè)置通道計算時間 默認3s setIdleTime(IdleStatus status, int idleTime): status 設(shè)置是一方還是雙方 , idLetime 是超過多久就會進入空閑狀態(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提供的編解碼工廠,這個工廠的特性是以換行符’rn’為結(jié)束通信的標志。也就是說如果我們傳遞消息沒有換行符,另外一段會繼續(xù)接受消息知道接受到’rn’才會接受,并把接受到的消息通過編解碼器轉(zhuǎn)到IoHandler層供業(yè)務層處理。(這里博主被坑在這里了)

IoHandler

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

總結(jié)

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

詳解Java Socket通信封裝MIna框架

以上就是詳解Java Socket通信封裝MIna框架的詳細內(nèi)容,更多關(guān)于Java Socket通信封裝MIna框架的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: av色在线| 日韩av二区 | 超碰pron| 日本视频在线观看免费 | 激情小视频在线观看 | 国产精品久久久久精 | 国产乱淫av免费 | 91亚洲国产成人久久精品网站 | 成人短视频在线免费观看 | 91麻豆天美传媒在线 | 午夜婷婷网 | 免费观看一级黄色片 | 亚洲一| 欧美国产日韩一区二区三区 | 青青草手机在线 | 午夜啊啊啊 | 国产成人精品亚洲男人的天堂 | 成人片网址 | 天堂欧美城网站 | 亚洲精品福利视频 | 久久理伦 | 一级欧美大片 | 五月婷网站 | 影音先锋国产资源 | 97在线视频免费观看 | 欧美黄色成人 | 99青草 | 三星手机最新款 | 国产精品第9页 | 色吊丝欧美 | 欧美日韩中文字幕一区 | 婷婷综合视频 | 99热在线看 | 精品久久在线 | 成人日批视频 | 久久com| 99re视频| 亚洲激情视频在线观看 | 免费a级黄色片 | 国产午夜精品理论片 | 国产精品视频一区二区三区不卡 |