#
管理層級 |
序列層級 | 職銜 | 對應T序 | 薪資區(qū)間(技術(shù)) |
M5 | CXO | —— | —— |
M5 | VP | —— | —— |
M4-3 | 高級總監(jiān) | —— | —— |
M4-2 | 總監(jiān) | T5 | 40-50k |
M4-1 | 副總監(jiān) | T5 | 35-45k |
M3 | 高級經(jīng)理 | T4-2 | 30-40k |
M2-2 | 經(jīng)理 | T4-1 | 25-35k |
M2-1 | 副經(jīng)理 | T3-2 | 20-30k |
M1 | 主管 | T3-1 | 15-25k |
技術(shù)層級 |
序列層級 | 職銜 | 對應M序 | 薪資區(qū)間(技術(shù)) |
T5-3 | 專家3 | 總監(jiān)/副總監(jiān) | 35-50k |
T5-2 | 專家2 | 總監(jiān)/副總監(jiān) | 35-50k |
T5-1 | 專家1 | 總監(jiān)/副總監(jiān) | 35-50k |
T4-2 | 資深2 | 高級經(jīng)理 | 30-40k |
T4-1 | 資深1 | 經(jīng)理 | 25-35k |
T3-2 | 高級2 | 副經(jīng)理 | 20-30k |
T3-1 | 高級1 | 主管 | 15-25k |
T2-2 | 中級2 | —— | 10-20K |
T2-1 | 中級1 | —— | 5-15K |
T1-2 | 初級2 | —— | 5-10K |
T1-1 | 初級1 | —— | 0-8k |
ANDROID APP 與 WEB APP有相似之處,都是需要在容器內(nèi)運行,都可以對事件進行響應。
WEB APP的核心組件是SERVLET,這是對游覽器事件進行響應的一個類,事件有GET/POST等事件,不同的URL對應不同的SERVLET。
如果要輸出不同的內(nèi)容,則輸出不同的HTML即可。
WEB APP的配置文件是WEB.XML,當容器啟動時,會從這讀取有多少個SERVLET。當瀏覽器發(fā)過來不同的URL請求時,會從中選擇相應的SERVLET執(zhí)行。
ANDROID APP的核心組件是ACTIVITY,這是一個對系統(tǒng)事件進行響應的一個類,事件有啟動事件,菜單點擊事件等,點擊不同的地方對應不同的ACTIVITY。
如果要輸出不同的內(nèi)容,則輸出不同的VIEW即可。
ANDROID APP的配置文件是MAINFRE.XML,當應用被部署到系統(tǒng)時,系統(tǒng)會從這讀取有多少個ACTIVITY。當不同的事件發(fā)生時,系統(tǒng)會會從中選擇相應的ACTIVITY執(zhí)行。
The architecture representation will basically adopt the 4 + 1 View Model as
recommended, to organize the architectural description from different perspectives, each
of which addresses a specific set of concerns:
• Requirement View – describes the software requirements, functional and
non-functional, illustrated by significant use cases and scenarios.
• Logical View – describes the object model of the design, the system
decomposition into layers and subsystems, and the dependencies between them.
• Process View – describes the concurrency and synchronization aspects of the
design.
• Implementation View – describes the software’s static organization in the
development environment.
• Deployment View – describes the mapping of the software onto hardware.
• Data View – describes the database design for the software.
It allows various stakeholders to find what they need in the software architecture. System
engineers can approach it from the logical view, process view and deployment view. DBA
can approach it from the data view. Project managers and software configuration
managers can approach it from the development view.
Demo:
- CUHK RFID - White Paper

- Middleware Quick Start Guide

- Tag Capturer Quick Start Guide

- Middleware System Design Document

- Tag Capturer System Design Document

- Middleware Test Cases

- Middleware Test Plan

- Middleware Source Code

|
數(shù)據(jù)導出:
1 將數(shù)據(jù)庫TEST完全導出,用戶名system 密碼manager 導出到D:\daochu.dmp中
exp system/manager@TEST file=d:\daochu.dmp full=y
2 將數(shù)據(jù)庫中system用戶與sys用戶的表導出
exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)
3 將數(shù)據(jù)庫中的表table1 、table2導出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)
4 將數(shù)據(jù)庫中的表table1中的字段filed1以"00"打頭的數(shù)據(jù)導出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1)query=\" where filed1 like '00%'\"
上面是常用的導出,對于壓縮我不太在意,用winzip把dmp文件可以很好的壓縮。
不過在上面命令后面 加上 compress=y 就可以了
數(shù)據(jù)的導入
1 將D:\daochu.dmp 中的數(shù)據(jù)導入 TEST數(shù)據(jù)庫中。
imp system/manager@TEST file=d:\daochu.dmp
上面可能有點問題,因為有的表已經(jīng)存在,然后它就報錯,對該表就不進行導入。
在后面加上 ignore=y 就可以了。
2 將d:\daochu.dmp中的表table1 導入
imp system/manager@TEST file=d:\daochu.dmp tables=(table1)
基本上上面的導入導出夠用了。不少情況我是將表徹底刪除,然后導入。
注意:
你要有足夠的權(quán)限,權(quán)限不夠它會提示你。
數(shù)據(jù)庫時可以連上的。可以用tnsping TEST 來獲得數(shù)據(jù)庫TEST能否連上
附錄一:
給用戶增加導入數(shù)據(jù)權(quán)限的操作
第一,啟動sql*puls
第二,以system/manager登陸
第三,create user 用戶名 IDENTIFIED BY 密碼 (如果已經(jīng)創(chuàng)建過用戶,這步可以省略)
第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
DBA,CONNECT,RESOURCE,CREATE SESSION TO 用戶名字
第五, 運行-cmd-進入dmp文件所在的目錄,
imp userid=system/manager full=y file=*.dmp
或者 imp userid=system/manager full=y file=filename.dmp
安裝oracle9I
Szportdb\szportdb\szportdb
用sysdba 登錄建立用戶:szportdb 表空間可以自己設定,也可以Users
倒入數(shù)據(jù)庫。
Imp szportdb/szportdb@szportdb full=y C:\szportdb.dmp ignore=
1、前言
Apache MINA是Apache組織的一個優(yōu)秀的項目。MINA是Multipurpose Infrastructure for NetworkApplications的縮寫。它是一個網(wǎng)絡應用程序框架,用來幫助用戶非常方便地開發(fā)高性能和高可靠性的網(wǎng)絡應用程序。在本文中介紹了 如何通過Apache Mina2.0來實現(xiàn)TCP協(xié)議長連接和短連接應用。
2、系統(tǒng)介紹
2.1系統(tǒng)框架
整個系統(tǒng)由兩個服務端程序和兩個客戶端程序組成。分別實現(xiàn)TCP長連接和短連接通信。
系統(tǒng)業(yè)務邏輯是一個客戶端與服務端建立長連接,一個客戶端與服務端建立短連接。數(shù)據(jù)從短連接客戶端經(jīng)過服務端發(fā)送到長連接客戶端,并從長連接客戶端接收響應數(shù)據(jù)。當收到響應數(shù)據(jù)后斷開連接。
系統(tǒng)架構(gòu)圖如下:
2.2處理流程
系統(tǒng)處理流程如下:
1) 啟動服務端程序,監(jiān)聽8001和8002端口。
2) 長連接客戶端向服務端8002端口建立連接,服務端將連接對象保存到共享內(nèi)存中。由于采用長連接方式,連接對象是唯一的。
3) 短連接客戶端向服務端8001端口建立連接。建立連接后創(chuàng)建一個連接對象。
4) 短連接客戶端連接成功后發(fā)送數(shù)據(jù)。服務端接收到數(shù)據(jù)后從共享內(nèi)存中得到長連接方式的連接對象,使用此對象向長連接客戶端發(fā)送數(shù)據(jù)。發(fā)送前將短連接對象設為長連接對象的屬性值。
5) 長連接客戶端接收到數(shù)據(jù)后返回響應數(shù)據(jù)。服務端從長連接對象的屬性中取得短連接對象,通過此對象將響應數(shù)據(jù)發(fā)送給短連接客戶端。
6) 短連接客戶端收到響應數(shù)據(jù)后,關(guān)閉連接。
3、服務端程序
3.1長連接服務端
服務啟動
public class MinaLongConnServer {
private static final int PORT = 8002;
public void start()throws IOException{
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
acceptor.setHandler(new MinaLongConnServerHandler());
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.bind(new InetSocketAddress(PORT));
System.out.println("Listeningon port " + PORT);
}
}
//消息處理
public class MinaLongConnServerHandler extends IoHandlerAdapter {
private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());
@Override
public void sessionOpened(IoSession session) {
InetSocketAddress remoteAddress = (InetSocketAddress)session.getRemoteAddress();
String clientIp = remoteAddress.getAddress().getHostAddress();
logger.info("LongConnect Server opened Session ID ="+String.valueOf(session.getId()));
logger.info("接收來自客戶端 :" + clientIp + "的連接.");
Initialization init = Initialization.getInstance();
HashMap<String, IoSession> clientMap =init.getClientMap();
clientMap.put(clientIp, session);
}
@Override
public void messageReceived(IoSession session, Object message) {
logger.info("Messagereceived in the long connect server..");
String expression = message.toString();
logger.info("Message is:" + expression);
IoSession shortConnSession =(IoSession) session.getAttribute("shortConnSession");
logger.info("ShortConnect Server Session ID ="+String.valueOf(shortConnSession.getId()));
shortConnSession.write(expression);
}
@Override
public void sessionIdle(IoSession session, IdleStatus status) {
logger.info("Disconnectingthe idle.");
// disconnect an idle client
session.close(true);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
// close the connection onexceptional situation
logger.warn(cause.getMessage(), cause);
session.close(true);
}
}
3.2短連接服務端
服務啟動
public class MinaShortConnServer {
private static final int PORT = 8001;
public void start()throws IOException{
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
acceptor.setHandler(new MinaShortConnServerHandler());
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);
acceptor.bind(new InetSocketAddress(PORT));
System.out.println("Listeningon port " + PORT);
}
}
消息處理
public class MinaShortConnServerHandler
extends IoHandlerAdapter {
private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());
@Override
public void sessionOpened(IoSession session) {
InetSocketAddress remoteAddress = (InetSocketAddress)session.getRemoteAddress();
logger.info(remoteAddress.getAddress().getHostAddress());
logger.info(String.valueOf(session.getId()));
}
@Override
public void messageReceived(IoSession session, Object message) {
logger.info("Messagereceived in the short connect server

");
String expression = message.toString();
Initialization init = Initialization.getInstance();
HashMap<String, IoSession> clientMap =init.getClientMap();
if (clientMap ==
null || clientMap.size() == 0) {
session.write("error");
}
else {
IoSession longConnSession =
null;
Iterator<String> iterator =clientMap.keySet().iterator();
String key = "";
while (iterator.hasNext()) {
key = iterator.next();
longConnSession = clientMap.get(key);
}
logger.info("ShortConnect Server Session ID :"+String.valueOf(session.getId()));
logger.info("LongConnect Server Session ID :"+String.valueOf(longConnSession.getId()));
longConnSession.setAttribute("shortConnSession",session);
longConnSession.write(expression);
}
}
@Override
public void sessionIdle(IoSession session, IdleStatus status) {
logger.info("Disconnectingthe idle.");
// disconnect an idle client
session.close(
true);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
// close the connection onexceptional situation
logger.warn(cause.getMessage(), cause);
session.close(
true);
}
}
4、客戶端程序
4.1長連接客戶端
使用java.net.Socket來實現(xiàn)向服務端建立連接。Socket建立后一直保持連接,從服務端接收到數(shù)據(jù)包后直接將原文返回。
public class TcpKeepAliveClient {
private String ip;
private int port;
private static Socket socket = null;
private static int timeout = 50 * 1000;
public TcpKeepAliveClient(String ip, int port) {
this.ip = ip;
this.port = port;
}
public void receiveAndSend() throws IOException {
InputStream input = null;
OutputStream output = null;
try {
if (socket == null || socket.isClosed() || !socket.isConnected()) {
socket = new Socket();
InetSocketAddress addr = new InetSocketAddress(ip, port);
socket.connect(addr, timeout);
socket.setSoTimeout(timeout);
System.out.println("TcpKeepAliveClientnew ");
}
input = socket.getInputStream();
output = socket.getOutputStream();
// read body
byte[] receiveBytes = {};// 收到的包字節(jié)數(shù)組
while (true) {
if (input.available() > 0) {
receiveBytes = new byte[input.available()];
input.read(receiveBytes);
// send
System.out.println("TcpKeepAliveClientsend date :" + new String(receiveBytes));
output.write(receiveBytes, 0, receiveBytes.length);
output.flush();
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("TcpClientnew socket error");
}
}
public static void main(String[] args) throws Exception {
TcpKeepAliveClient client = new TcpKeepAliveClient("127.0.0.1", 8002);
client.receiveAndSend();
}
}
4.2短連接客戶端
服務啟動
public class MinaShortClient {
private static final int PORT = 8001;
public static void main(String[] args) throws IOException,InterruptedException {
IoConnector connector = new NioSocketConnector();
connector.getSessionConfig().setReadBufferSize(2048);
connector.getFilterChain().addLast("logger", new LoggingFilter());
connector.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
connector.setHandler(new MinaShortClientHandler());
for (int i = 1; i <= 10; i++) {
ConnectFuture future = connector.connect(new InetSocketAddress("127.0.0.1", PORT));
future.awaitUninterruptibly();
IoSession session =future.getSession();
session.write(i);
session.getCloseFuture().awaitUninterruptibly();
System.out.println("result=" + session.getAttribute("result"));
}
connector.dispose();
}
}
消息處理
public class MinaShortClientHandler extends IoHandlerAdapter{
private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());
public MinaShortClientHandler() {
}
@Override
public void sessionOpened(IoSession session) {
}
@Override
public void messageReceived(IoSession session, Object message) {
logger.info("Messagereceived in the client..");
logger.info("Message is:" + message.toString());
session.setAttribute("result", message.toString());
session.close(true);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
session.close(true);
}
}
5、總結(jié)
通過本文中的例子,Apache Mina在服務端可實現(xiàn)TCP協(xié)議長連接和短連接。在客戶端只實現(xiàn)了短連接模式,長連接模式也是可以實現(xiàn)的(在本文中還是采用傳統(tǒng)的java Socket方式)。兩個服務端之間通過共享內(nèi)存的方式來傳遞連接對象也許有更好的實現(xiàn)方式。
本文將通過一個簡單的問候程序 HelloServer 來介紹 MINA 的基礎架構(gòu)的同時演示如何使用 MINA 開發(fā)網(wǎng)絡應用程序。
Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 組織一個較新的項目,它為開發(fā)高性能和高可用性的網(wǎng)絡應用程序提供了非常便利的框架。當前發(fā)行的 MINA 版本支持基于 Java NIO 技術(shù)的 TCP/UDP 應用程序開發(fā)、串口通訊程序(只在最新的預覽版中提供),MINA 所支持的功能也在進一步的擴展中。
目前正在使用 MINA 的軟件包括有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、Openfire 等等。
本文將通過一個簡單的問候程序 HelloServer 來介紹 MINA 的基礎架構(gòu)的同時演示如何使用MINA 開發(fā)網(wǎng)絡應用程序。
環(huán)境準備
首先到官方網(wǎng)站下載最新的 MINA 版本,地址是:http://mina.apache.org/downloads.html。下載之前先介紹一下 MINA 的兩個版本:1.0.x 適合運行環(huán)境為 JDK1.4,1.1.x 適合 JDK1.5 的版本,兩者的編譯環(huán)境都需要 JDK1.5。JDK1.5 已經(jīng)是非常普遍了,本文中使用 1.1.5 版本的 MINA,編譯和運行所需的文件是 mina-core-1.1.5.jar。
下載 MINA 的依賴包 slf4j。MINA 使用此項目作為日志信息的輸出,而 MINA 本身并不附帶此項目包,請到http://www.slf4j.org/download.html 地址下載 slf4j 包,slf4j 項目解壓后有很多的文件,本例中只需要其中的 slf4j-api-1.4.3.jar 和 slf4j-simple-1.4.3.jar 這兩個 jar 文件。如果沒有這兩個文件就會導致啟動例子程序的時候報 org/slf4j/LoggerFactory 類沒找到的錯誤。
當然要求機器上必須裝有 1.5 或者更新版本的 JDK。
最好你應該選擇一個順手的 Java 開發(fā)環(huán)境例如 Eclipse 或者 NetBeans 之類的,可以更方便的編碼和調(diào)試,雖然我們的最低要求只是一個簡單的文本編輯器而已。
編寫代碼并執(zhí)行
編寫代碼 HelloServer.java 如下
package demo.mina.echo;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.mina.common.*;
import org.apache.mina.transport.socket.nio.*;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
/**
* HelloServer演示程序
* @author liudong (
http://www.dlog.cn/javayou
)
*/
public class HelloServer {
private static final int PORT = 8080;
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
IoAcceptor acceptor = new SocketAcceptor();
IoAcceptorConfig config = new SocketAcceptorConfig();
DefaultIoFilterChainBuilder chain = config.getFilterChain();
//使用字符串編碼
chain.addLast("codec",
new ProtocolCodecFilter(new TextLineCodecFactory()));
//啟動HelloServer
acceptor.bind(new InetSocketAddress(PORT), new HelloHandler(), config);
System.out
.println("HelloServer started on port " +
PORT);
}
}
/**
* HelloServer的處理邏輯
* @author liudong
*/
class HelloHandler extends IoHandlerAdapter {
/**
* 當有異常發(fā)生時觸發(fā)
*/
@Override
public void exceptionCaught(IoSession ssn, Throwable cause) {
cause.printStackTrace();
ssn.close();
}
/**
* 有新連接時觸發(fā)
*/
@Override
public void sessionOpened(IoSession ssn) throws Exception {
System.out.println("session open for " + ssn.getRemoteAddress());
}
/**
* 連接被關(guān)閉時觸發(fā)
*/
@Override
public void sessionClosed(IoSession ssn) throws Exception {
System.out.println("session closed from " + ssn.getRemoteAddress());
}
/**
* 收到來自客戶端的消息
*/
public void messageReceived(IoSession ssn, Object msg) throws Exception {
String ip = ssn.getRemoteAddress().toString();
System.out.println("===> Message From " + ip +" : " + msg);
ssn.write("Hello " + msg);
}
}
編譯執(zhí)行
先不用試著去讀懂每一行代碼的具體意思,用你順手的編譯器編譯 HelloServer.java,如果報錯請確認是否已將前面提到的三個 jar 文件添加至類路徑中。如果一切順利接著就可以啟動HelloServer 程序,啟動后提示:HelloServer started on port 8080 表示啟動成功,如果啟動失敗,問題無外乎是類沒找到或者端口占用。如果端口被占用的話,換一個羅,修改 PORT 常量值后再次編譯并啟動。
測試服務器
打開命令行窗口,輸入 telnet localhost 8080 后,輸入您的英文名或者其他一些亂七八糟的字符后回車再去看看剛啟動的服務程序有何反應。我的反應如下:
HelloServer started on port 8080
session open for /127.0.0.1:3023
===> Message From /127.0.0.1:3023 :hello
===> Message From /127.0.0.1:3023 :hello
===> Message From /127.0.0.1:3023 :liudong
===> Message From /127.0.0.1:3023 :Winter Lau
好了,一切正常,恭喜你的第一個使用 MINA 開發(fā)的網(wǎng)絡程序已經(jīng)成功運行了。
MINA 基本類的描述
在介紹架構(gòu)之前先認識幾個接口:
IoAccepter 相當于網(wǎng)絡應用程序中的服務器端
IoConnector 相當于客戶端
IoSession 當前客戶端到服務器端的一個連接實例
IoHandler 業(yè)務處理邏輯
IoFilter 過濾器用于懸接通訊層接口與業(yè)務層接口
MINA 的基礎架構(gòu)
下圖是 MINA 的架構(gòu)圖,
圖 1:MINA 的架構(gòu)圖

在圖中的模塊鏈中,IoService 便是應用程序的入口,相當于我們前面代碼中的 IoAccepter,IoAccepter 便是 IoService 的一個擴展接口。IoService 接口可以用來添加多個 IoFilter,這些 IoFilter 符合責任鏈模式并由 IoProcessor 線程負責調(diào)用。而 IoAccepter 在 ioService 接口的基礎上還提供綁定某個通訊端口以及取消綁定的接口。在上面的例子中,我們是這樣使用 IoAccepter 的:
IoAcceptor acceptor = new SocketAcceptor();
相當于我們使用了 Socket 通訊方式作為服務的接入,當前版本的 MINA 還提供了除 SocketAccepter 外的基于數(shù)據(jù)報文通訊的 DatagramAccepter 以及基于管道通訊的 VmPipeAccepter。另外還包括串口通訊接入方式,目前基于串口通訊的接入方式已經(jīng)在最新測試版的 MINA 中提供。你也可以自行實現(xiàn) IoService 接口來使用自己的通訊方式。
而在上圖中最右端也就是 IoHandler,這便是業(yè)務處理模塊。相當于前面例子中的 HelloHandler 類。在業(yè)務處理類中不需要去關(guān)心實際的通訊細節(jié),只管處理客戶端傳輸過來的信息即可。編寫 Handler 類就是使用 MINA 開發(fā)網(wǎng)絡應用程序的重心所在,相當于 MINA 已經(jīng)幫你處理了所有的通訊方面的細節(jié)問題。為了簡化 Handler 類,MINA 提供了 IoHandlerAdapter 類,此類僅僅是實現(xiàn)了 IoHandler 接口,但并不做任何處理。
一個 IoHandler 接口中具有如下一些方法(摘自 MINA 的 API 文檔):
void exceptionCaught(IoSession session, Throwable cause)
當接口中其他方法拋出異常未被捕獲時觸發(fā)此方法
void messageReceived(IoSession session, Object message)
當接收到客戶端的請求信息后觸發(fā)此方法.
void messageSent(IoSession session, Object message)
當信息已經(jīng)傳送給客戶端后觸發(fā)此方法.
void sessionClosed(IoSession session)
當連接被關(guān)閉時觸發(fā),例如客戶端程序意外退出等等.
void sessionCreated(IoSession session)
當一個新客戶端連接后觸發(fā)此方法.
void sessionIdle(IoSession session, IdleStatus status)
當連接空閑時觸發(fā)此方法.
void sessionOpened(IoSession session)
當連接后打開時觸發(fā)此方法,一般此方法與 sessionCreated 會被同時觸發(fā)
前面我們提到 IoService 是負責底層通訊接入,而 IoHandler 是負責業(yè)務處理的。那么 MINA 架構(gòu)圖中的 IoFilter 作何用途呢?答案是你想作何用途都可以。但是有一個用途卻是必須的,那就是作為 IoService 和 IoHandler 之間的橋梁。IoHandler 接口中最重要的一個方法是 messageReceived,這個方法的第二個參數(shù)是一個 Object 型的消息,總所周知,Object 是所有 Java 對象的基礎,那到底誰來決定這個消息到底是什么類型呢?答案也就在這個 IoFilter 中。在前面使用的例子中,我們添加了一個 IoFilter 是 new ProtocolCodecFilter(new TextLineCodecFactory()),這個過濾器的作用是將來自客戶端輸入的信息轉(zhuǎn)換成一行行的文本后傳遞給 IoHandler,因此我們可以在 messageReceived 中直接將 msg 對象強制轉(zhuǎn)換成 String 對象。
而如果我們不提供任何過濾器的話,那么在 messageReceived 方法中的第二個參數(shù)類型就是一個 byte 的緩沖區(qū),對應的類是 org.apache.mina.common.ByteBuffer。雖然你也可以將解析客戶端信息放在 IoHandler 中來做,但這并不是推薦的做法,使原來清晰的模型又模糊起來,變得 IoHandler 不只是業(yè)務處理,還得充當協(xié)議解析的任務。
MINA自身帶有一些常用的過濾器,例如LoggingFilter(日志記錄)、BlackListFilter(黑名單過濾)、CompressionFilter(壓縮)、SSLFilter(SSL加密)等。
其他
MINA 不僅僅是用來開發(fā)網(wǎng)絡服務器端應用程序,它一樣可以使用 IoConnector 來連接到各種各樣的網(wǎng)絡服務程序。
通過本文中 HelloServer 這個例子,我們在驚嘆 MINA 可以帶來多么大便利的同時,還不得不為其卓越的性能而驕傲,據(jù)稱使用MINA開發(fā)服務器程序的性能已經(jīng)逼近使用 C/C++ 語言開發(fā)的網(wǎng)絡服務。作為 MINA 的入門文章,性能問題不在本文討論范圍內(nèi)。
另外在 MINA 壓縮包中附帶有不少比 HelloServer 要好得多的例子,通過這些例子可以進一步的了解并掌握 MINA。
參考資料
http://mina.apache.org MINA 官方網(wǎng)站
http://mina.apache.org/features.html 您可以在這里查看關(guān)于 MINA 的更多特性
http://mina.apache.org/testimonials.html 看看別人是如何評價 MINA 的 http://asyncweb.safehaus.org/使用 MINA 開發(fā)的高性能 WEB 服務器