導航:首頁 > 凈水問答 > minassl過濾器切換

minassl過濾器切換

發布時間:2022-04-24 00:37:47

① 安卓會不會用到apache mina

最近在做一個項目的android的網路模塊,發送認證消息及請求信息至伺服器,通過認證後,伺服器返回我所需的數據流,選擇Apache mina作為框架,在IOFilter層,我設置過濾器為
IoConnector connector=new NioSocketConnector();
connector.getFilterChain().addLast(
"myCodec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("GB2312"))));

聯網認證成功後,返回的數據流不是字元串類型,使用該過濾器報異常了:org.apache.mina.filter.codec.ProtocolDecoderException: java.nio.charset.MalformedInputException: Input length = 1 (Hexmp:
大致是字元串亂碼問題,無法解析,網上查了一些資料,沒有解決方案。
我想應該是過濾器設置的問題,因為返回的數據流本來就不是字元串類型,經該過濾器處理,自然會出錯。我覺得應該有兩種方法來解決這個問題:
(1)不使用mina自帶的過濾器,自己寫一個過濾器;發現這樣可能比較麻煩,顯得比較復雜,加上我也是新手一枚,難度有點大,放棄了...
(2)不使用mina的過濾器,mina框架為3層,過濾器設置處於第二層,我在此處不設置過濾器,直接將我要發送到伺服器的內容轉換為byte型數組寫入IoBuffer中,將IoBuffer發送到伺服器,代碼如下:
connector = new NioSocketConnector(); connector.setConnectTimeoutMillis(3000);
connector.setHandler(new ClientHandler(MinaTest4AndroidActivity.this, mFd));
future = connector.connect(new InetSocketAddress(host, port));// 創建連接 future.awaitUninterruptibly();// 等待連接創建完成
String info ="這里是你需要發送到伺服器的數據.......";

byte bt[]=info.getBytes();//轉換為位元組型數組 IoBuffer info_buffer=IoBuffer.allocate(bt.length);
info_buffer.put(bt,0,bt.length);//寫入buffer中
info_buffer.flip();
session = future.getSession(); session.write(info_buffer);// 不使用過濾器,直接發送位元組流

這樣不經過過濾器,便不會報該異常,當然,沒有了過濾器,在
@Override public void messageReceived(IoSession session, Object message)
throws Exception {
IoBuffer buffer = (IoBuffer) message;
}該函數中接收到得為IoBuffer型,然後根據需要將它轉化為需要的數據類型。

這樣,不會再報異常,在IoHandler中根據伺服器返回的數據,再做相應的業務上的處理.......

② mina的過濾器別名能隨便取么

底層通信比較多的 一般的消息系統中間件 都可以用的 還有很多分布式的也會用到通信的 凡是用到通信的 都可以用mina的

③ androidpn tomcat版有什麼優點

在Androidpn的底層主要採用的兩大框架mina和openfire兩大框架,其中mina主要為底層數據傳輸的Socket框架。下面簡單的介紹一下Socket框架
Apache Mina Server 是一個網路通信應用框架,也就是說,它主要是對基於TCP/IP、UDP/IP協議棧的通信框架(也可以提供JAVA 對象的序列化服務、虛擬機管道通信服務等),Mina 同時提供了網路通信的Server 端、Client 端的封裝,無論是哪端,Mina 在整個網通通信結構中都處於如下的位置:

1.spring初始化並啟動過程,調用NioSocketAcceptor。

2.NioSocketAcceptor開始執行調用IoProcessor.

3.IoProcessor開始調用FilterChain。FilterChain調用相關的IoFilter的。其中ProtocolCodecFilter的過濾器調用了org.androidpn.server.xmpp.codec.XmppCodecFactory進行編碼。

4.XmppIoHandler實現自IoHanlder並調用通過openfire 的XMLLightweightParser解析相關的業務邏輯。

5.根據解析的信息調用xmpp並處理相關信息。

AndroidPN(Android Push Notification) 是一個基於XMPP協議的Java開源推送通知實現,它包含了完整的客戶端和服務端。

AndroidPN基於Openfire下的一些開源項目構建。

AndroidPN伺服器包含兩個部分,

一個是偵聽在5222埠上的XMPP服務,負責與客戶端的XMPPConnection類進行通信,作用是用戶注冊和身份認證,並發送推送通知消息。

另外一部分是Web伺服器,採用一個輕量級的HTTP伺服器,負責接收用戶的Web請求。

最上層包含四個組成部分,分別是SessionManager,Auth Manager,PresenceManager以及Notification Manager。

SessionManager負責管理客戶端與伺服器之間的會話。

Auth Manager負責客戶端用戶認證管理。

Presence Manager負責管理客戶端用戶的登錄狀態。

NotificationManager負責實現伺服器向客戶端推送消息功能。

IQHandler消息處理器的類:

IQHandler:消息處理器抽象類。

IQAuthHandler:許可權協議的消息處理類,消息的類型為:jabber:iq:auth

IQRegisterHandler:用戶注冊的消息處理類,消息類型為: jabber:iq:register

IQRosterHandler:用戶消息交互類,消息類型為:jabber:iq:roster

PresenceUpdateHandler:用戶狀態展現變化處理類。內部調用,不具有類型。

④ java mina接收與發送位元組數組(byte[])

要自己根據發送的數據包格式寫一個過濾器 ,或者將發送的數據包封裝成對象再發送。

⑤ mina tcp server怎麼發命令

Apache Mina Server 是一個網路通信應用框架,也就是說,它主要是對基於TCP/IP、UDP/IP協議棧的通信框架(當然,也可以提供JAVA 對象的序列化服務、虛擬機管道通信服務等),Mina 可以幫助我們快速開發高性能、高擴展性的網路通信應用,Mina 提供了事件驅動、非同步(Mina 的非同步IO 默認使用的是JAVA NIO 作為底層支持)操作的編程模型。Mina 主要有1.x 和2.x 兩個分支,這里我們講解最新版本2.0,如果你使用的是Mina 1.x,那麼可能會有一些功能並不適用。學習本文檔,需要你已掌握JAVA IO、JAVA NIO、JAVASocket、JAVA 線程及並發庫(java.util.concurrent.*)的知識。Mina 同時提供了網路通信的Server 端、Client 端的封裝,無論是哪端,Mina 在整個網通通信結構中都處於如下的位置:可見Mina 的API 將真正的網路通信與我們的應用程序隔離開來,你只需要關心你要發送、接收的數據以及你的業務邏輯即可。同樣的,無論是哪端,Mina 的執行流程如下所示:
(1.) IoService:這個介面在一個線程上負責套接字的建立,擁有自己的Selector,監聽是否有連接被建立。
(2.) IoProcessor:這個介面在另一個線程上,負責檢查是否有數據在通道上讀寫,也就是說它也擁有自己的Selector,這是與我們使用JAVA NIO 編碼時的一個不同之處,通常在JAVA NIO 編碼中,我們都是使用一個Selector,也就是不區分IoService與IoProcessor 兩個功能介面。另外,IoProcessor 負責調用注冊在IoService 上的過濾器,並在過濾器鏈之後調用IoHandler。
(3.) IoFilter:這個介面定義一組攔截器,這些攔截器可以包括日誌輸出、黑名單過濾、數據的編碼(write 方向)與解碼(read 方向)等功能,其中數據的encode 與decode是最為重要的、也是你在使用Mina 時最主要關注的地方。
(4.) IoHandler:這個介面負責編寫業務邏輯,也就是接收、發送數據的地方。
1. 簡單的TCPServer:
(1.) 第一步:編寫IoService
按照上面的執行流程,我們首先需要編寫IoService,IoService 本身既是服務端,又是客戶端,我們這里編寫服務端,所以使用IoAcceptor 實現,由於IoAcceptor 是與協議無關的,因為我們要編寫TCPServer,所以我們使用IoAcceptor 的實現NioSocketAcceptor,實際上底層就是調用java.nio.channels.ServerSocketChannel 類。當然,如果你使用了Apache 的APR 庫,那麼你可以選擇使AprSocketAcceptor 作為TCPServer 的實現,據傳說Apache APR庫的性能比JVM 自帶的本地庫高出很多。那麼IoProcessor 是由指定的IoService 內部創建並調用的,我們並不需要關心。

這段代碼我們初始化了服務端的TCP/IP 的基於NIO 的套接字,然後調用IoSessionConfig設置讀取數據的緩沖區大小、讀寫通道均在10 秒內無任何操作就進入空閑狀態。
(2.) 第二步:編寫過濾器
這里我們處理最簡單的字元串傳輸,Mina 已經為我們提供了TextLineCodecFactory 編解碼器工廠來對字元串進行編解碼處理。

這段代碼要在acceptor.bind()方法之前執行,因為綁定套接字之後就不能再做這些准備工作了。這里先不用清楚編解碼器是如何工作的,這個是後面重點說明的內容,這里你只需要清楚,我們傳輸的以換行符為標識的數據,所以使用了Mina 自帶的換行符編解碼器工廠。
(3.) 第三步:編寫IoHandler
這里我們只是簡單的列印Client 傳說過來的數據。

然後我們把這個IoHandler 注冊到IoService:

當然這段代碼也要在acceptor.bind()方法之前執行。然後我們運行MyServer 中的main 方法,你可以看到控制台一直處於阻塞狀態,此時,我們用telnet 127.0.0.1 9123 訪問,然後輸入一些內容,當按下回車鍵,你會發現數據在Server 端被輸出,但要注意不要輸入中文,因為Windows 的命令行窗口不會對傳輸的數據進行UTF-8 編碼。當輸入quit 結尾的字元串時,連接被斷開。這里注意你如果使用的操作系統,或者使用的Telnet 軟體的換行符是什麼,如果不清楚,可以刪掉第二步中的兩個紅色的參數,使用TextLineCodec 內部的自動識別機制。

⑥ org.apache.mina.core.buffer.iobuffer在哪個jar包

mina 心跳機制 ieRequest isResponse到底什麼時候調用 上下文設置: 伺服器端基於Mina開發,心跳包25秒發一次0D+0A,客戶端收到後,回0D-0A 因為客戶端設置了60秒一次心跳包,所以心跳包有伺服器端先發起。 客戶端心跳過濾器代碼:

⑦ apache mina 或者 netty ssl 通道加密,如何實現部分加密。

影響只是一點點,不是很多。就在和伺服器對接握手那一刻,成功後就和平時的一樣呢。建議還是整站加密。因為你只加密一部分。黑客可以通過其中的漏洞去入侵——沃通CA機構做數字認證證書領域的領跑者,buy.wosign.com

⑧ java 採用mina進行網路連接,怎樣在客戶端綁定本地的ip和port,下面的程序只指定了伺服器端

ConnectFuture future = connector.connect(new InetSocketAddress(
host, port));// 創建連接
future.awaitUninterruptibly();// 等待連接創建完成

⑨ MINA框架中文件傳輸

session.write()函數,寫入的是一個object對象,不能傳輸byte數組,所以你的傳輸過去的byte數組就不正確了 。。你應該用了mina提供的過濾器,所以客戶端和伺服器端才可以通訊,如果你不用過濾器,你用session.write()函數將byte數組發送給伺服器,伺服器是接受不到消息的,也就是在serverHandler類中不會觸發messageReceive函數。。mian是一個事件驅動模型的框架 。 。如果不用過濾器的話只能傳輸bytebuffer對象。想解決文件傳輸,你可以在客戶端用輸入流InputStream對象讀取文件放入byte數組中,然後將byte數組轉化成bytebuffer對象,注意這個bytebuffer對象應該是apache提供的 。然後在伺服器端用bytebuffer對象接受後再轉換成byte數組,這樣文件就可以傳輸了 。 我也是剛剛研究mina。這個方法只是下下策。我想mina框架中有一個fillter可以傳輸文件的 。 你好好看看mina api吧。對了我研究的是mina1.7版本的。。。希望我的回答對你有所幫助。

⑩ mina 心跳機制 ieRequest isResponse畢竟什麼時候調用

mina 心跳機制 ieRequest isResponse到底什麼時候調用

上下文設置:
伺服器端基於Mina開發,心跳包25秒發一次0D+0A,客戶端收到後,回0D-0A
因為客戶端設置了60秒一次心跳包,所以心跳包有伺服器端先發起。

客戶端心跳過濾器代碼:(伺服器端代碼就不貼了,差不多的)
package com.mina.client;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.keepalive.KeepAliveFilter;
import org.apache.mina.filter.keepalive.KeepAliveMessageFactory;
import org.apache.mina.filter.keepalive.;

public class MyKeepAliveFilter extends KeepAliveFilter {

public MyKeepAliveFilter() {
super(new KeepAliveMessageFactoryImpl(), IdleStatus.BOTH_IDLE, new ExceptionHandler(), 60, 70);
this.setForwardEvent(false); //此消息不會繼續傳遞,不會被業務層看見
}

}

class ExceptionHandler implements {
public void keepAliveRequestTimedOut(KeepAliveFilter filter, IoSession session) throws Exception {
System.out.println("心跳超時");
session.close(true);
}
}

class KeepAliveMessageFactoryImpl implements KeepAliveMessageFactory {
private static final byte int_req = '+'; // 2B
private static final byte int_rep = '-'; // 2D

private static final IoBuffer KAMSG_REQ = IoBuffer.wrap(new byte[]{0x0D, '+', 0x0A});
private static final IoBuffer KAMSG_REP = IoBuffer.wrap(new byte[]{0x0D, '-', 0x0A});

/**
* 此方法為發心跳包,發+
*/
@Override
public Object getRequest(IoSession arg0) {
System.out.println();
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " 發心跳包+:" + KAMSG_REQ.plicate());
return KAMSG_REQ.plicate();
}

/**
* 收到對方的心跳包後,此方法回心跳包,回-
*/
@Override
public Object getResponse(IoSession arg0, Object arg1) {
System.out.println();
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " 回心跳包-:" + KAMSG_REP.plicate());
return KAMSG_REP.plicate();
}

/**
* 是否是心跳請求包,不管是對方的還是自己的
*/
@Override
public boolean isRequest(IoSession session, Object message) {
if(!(message instanceof IoBuffer)) {
return false;
}

IoBuffer realMessage = (IoBuffer)message;
System.out.println();
if(realMessage.limit() != 3) {
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " isRequest limit不等於3,RETURN FALSE: message長度:" + realMessage.limit() + " : " + realMessage);
return false;
} else {
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " isRequest limit等於3, message長度:" + realMessage.limit() + " : " + realMessage);
}

if (realMessage.remaining() != 3) {
return false;
}

byte[] b = new byte[3];
realMessage.get(b);

boolean result = (b[1] == int_req);

System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " isRequest 判斷是否為+:" + result);
realMessage.rewind(); // 把pos重新設為0

return result;
}

/**
* 判斷是否是心跳響應包,不管是對方的,還是自己的
*/
@Override
public boolean isResponse(IoSession session, Object message) {
if(!(message instanceof IoBuffer)) {
return false;
}

IoBuffer realMessage = (IoBuffer)message;
System.out.println();
if(realMessage.limit() != 3) {
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " isResponse limit不等於3,RETURN FALSE: message長度:" + realMessage.limit() + " : " + realMessage);
return false;
} else {
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " isResponse limit等於3, message長度:" + realMessage.limit() + " : " + realMessage);
}

if (realMessage.remaining() != 3) {
return false;
}

byte[] b = new byte[3];
realMessage.get(b);

boolean result = (b[1] == int_rep);
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " isResponse 判斷是否為-:" + result);
realMessage.rewind(); // 把pos重新設為0

return result;
}

}

輸出的日誌:
20141113-15:49:00-778 isRequest limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=2048: 0D 2B 0A]
20141113-15:49:00-779 isRequest 判斷是否為+:true

20141113-15:49:00-779 回心跳包-:HeapBuffer[pos=0 lim=3 cap=3: 0D 2D 0A]

20141113-15:49:00-780 isResponse limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=2048: 0D 2B 0A]
20141113-15:49:00-780 isResponse 判斷是否為-:false

20141113-15:49:00-781 isRequest limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=2048: 0D 2B 0A]
20141113-15:49:00-781 isRequest 判斷是否為+:true

20141113-15:49:00-782 isRequest limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=3: 0D 2D 0A]
20141113-15:49:00-783 isRequest 判斷是否為+:false

20141113-15:49:00-783 isResponse limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=3: 0D 2D 0A]
20141113-15:49:00-783 isResponse 判斷是否為-:true

20141113-15:49:25-794 isRequest limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=1024: 0D 2B 0A]
20141113-15:49:25-795 isRequest 判斷是否為+:true

20141113-15:49:25-795 回心跳包-:HeapBuffer[pos=0 lim=3 cap=3: 0D 2D 0A]

20141113-15:49:25-796 isResponse limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=1024: 0D 2B 0A]
20141113-15:49:25-796 isResponse 判斷是否為-:false

20141113-15:49:25-797 isRequest limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=1024: 0D 2B 0A]
20141113-15:49:25-797 isRequest 判斷是否為+:true

20141113-15:49:25-798 isRequest limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=3: 0D 2D 0A]
20141113-15:49:25-798 isRequest 判斷是否為+:false

20141113-15:49:25-799 isResponse limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=3: 0D 2D 0A]
20141113-15:49:25-799 isResponse 判斷是否為-:true

有此得出
以上可得出:
對方是25秒一次心跳包,發+
如果對方先發心跳包,我方回心跳-後,如果心跳一直維持,就不會再主動發出+,除非超過設定的60秒的時候。
本地收到消息後
1、走isRequest,發現傳遞進來的數據為+,則return true,getResponse()回-
2、走isResponse,發現傳遞進來的數據為+,則return false
3、走isRequest,發現傳遞進來的數據為+,則return true,但沒有回-
4、走isRequest,發現傳遞進來的數據為-,則return faslse
5、走isResponse,發現傳遞進來的數據位-,則 return true,但沒有回+

如果本地先發心跳包

發+

isRequest 傳進來+,對方收到+後,回-
isRequest 傳進來-
isResopnse 傳進來-
isResponse 傳進來-
isResponse 傳進來-

閱讀全文

與minassl過濾器切換相關的資料

熱點內容
全順空調濾芯安裝在哪裡 瀏覽:446
ro膜進出水管多粗 瀏覽:441
單過硫酸氫鉀消毒污水測什麼值 瀏覽:399
膠印油墨樹脂乳化 瀏覽:703
蘋果六代廂式純水機怎麼樣 瀏覽:174
污水池環氧樹脂防腐用什麼固化劑 瀏覽:748
高效濃縮除垢劑 瀏覽:959
污水站CH2是什麼管子 瀏覽:308
千島人凈水器4節5節如何連接 瀏覽:687
城市污水處理及污染防治技術政策6 瀏覽:125
潔廁靈除垢的化學反應 瀏覽:972
閻良區城東污水處理廠2019年 瀏覽:341
凈水器哪個品牌的濾芯最好 瀏覽:727
飲水機開水開不開怎麼辦 瀏覽:628
電鍍廢水吧 瀏覽:453
鄉鎮生活污水目標責任書 瀏覽:48
西班牙在去年的廢水 瀏覽:400
小區廚房污水都從商鋪走路嗎 瀏覽:832
去厚水垢的辦法 瀏覽:140
3m6003cn怎麼換過濾棉 瀏覽:26