1. 程式人生 > >Apache MINA框架入門

Apache MINA框架入門

說明

NIO API是在Java 1.4引入的。MINA是基於NIO編寫的。首先要了解NIO與BIO的概念以及區別,NIO代表非阻塞IO,BIO代表著阻塞式IO。具體細節請百度。。。

MINA是一個簡單但功能齊全的網路應用框架(其實已經被NettyPK掉了,但都是一型別的東西,很多東西相通的,因為我們單位在用MINA所以優先看這個)。下載地址:http://mina.apache.org/downloads-mina.html    或者在maven中新增:

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.6</version>
            <type>jar.sha256</type>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.6</version>
        </dependency>
        <dependency>
            <groupId>org.rxtx</groupId>
            <artifactId>rxtx</artifactId>
            <version>2.1.7</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.mina</groupId>
            <artifactId>mina-core</artifactId>
            <version>2.0.7</version>
        </dependency>
        <dependency>

MINA的使用流程:

編寫自己的IoService,在這裡我們建立IoService的子類。隨後編寫不同的過濾器(例如關於編解碼的過濾器),將這些過濾器新增到過濾器鏈中,設定當前IoService監聽的埠(可以是多個),設定處理器也就是業務邏輯編寫的地方。

MINA說明:

當客戶端向這一埠傳送訊息,IoService會監聽這個埠,並經過過濾鏈進行處理後,傳給IoHandler,在這個處理器中有很多函式,這些函式會在不同情況下觸發(連線建立時、接收到訊息時、連線關閉時、連線超時時等等)。你需要重寫你需要的方法,在裡面編寫你的業務邏輯。

下面是MINA的一個示意圖:

一個簡單的demo:首先是編寫一個服務端

1. 首先是IoService的程式碼:

package com.mina;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class MinaTimeServer {

	public static void main(String[] args) throws IOException {
		//建立IoService的例項
		IoAcceptor acceptor = new NioSocketAcceptor();
		//設定過濾鏈  日誌、編解碼
		acceptor.getFilterChain().addLast("logger", new LoggingFilter());
		acceptor.getFilterChain().addLast("codec",
				new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
		//設定處理器 就是業務邏輯處理的地方
		acceptor.setHandler(new TimeServerHandler());
		//讓其監聽某個埠
		acceptor.bind(new InetSocketAddress(9123));
	}
}

2. 接下來就是編寫這個TimeServerHndler類了

package com.mina;

import java.util.Date;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

public class TimeServerHandler extends IoHandlerAdapter{
    //設定一個變數  
	 public static int count=0;
	
    //當捕獲到異常時會觸發(這裡不做任何處理,僅僅列印一下)
	public void execptionCaught(IoSession session,Throwable cause) throws Exception {	
		cause.printStackTrace();
	}
    //當接收到資料時觸發
	public void messageReceived(IoSession session, Object message) {
		String mes=message.toString();
    //當接受到的資料是quit時或者使用者請求大於2次關閉連線
	if(mes.trim().equalsIgnoreCase("quit")||count>2) {
		System.out.println("正在退出時間伺服器");
		session.write("正在退出時間伺服器。。。。");
		session.close();
		return;
	}
        //向客戶端回覆一個當前時間
		Date date = new Date();
		session.write(date.toString());
		System.out.println("message writen:"+mes);
		count++;
	}
	
}

這個時間伺服器就寫完了。可以在cmd視窗縣通過telnet命令向這個埠傳送資料,來測試一下。

測試服務端

開啟cmd視窗,輸入命令Telnet localhost 9123

注意:如果顯示這個不是內部命令什麼的,先檢查拼寫,沒問題後百度怎麼開啟電腦的teinet。

輸入該命令後窗口如下:

這時可以輸入任意字元,會發送到該埠,輸入quit退出。或者次數到了後也會自動斷開連線。

向伺服器傳送任意字元,伺服器會向你回覆一個時間戳。

下面我們自己寫一個客戶端來和服務端連線。

客戶端的編寫

客戶端和伺服器端的編寫幾乎是一樣的,將IoService替換一下,伺服器時我們用的是NioSocketAcceptor,客戶端我們換成NioSocketConnector。這兩個都是IoService的實現類。寫法差不多直接上程式碼:

這是IoService的程式碼:

package com.minaTcpClient;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

public class TcpClient {

	public static void main(String[] args) {
		//建立IoService例項
		NioSocketConnector connector = new NioSocketConnector();
		//設定過濾鏈
		connector.getFilterChain().addLast("logger", new LoggingFilter());
		connector.getFilterChain().addLast("codec",
				new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
		//設定處理器
		connector.setHandler(new TcpClientHandler());
		//連線地址
          ConnectFuture connect = connector.connect(new InetSocketAddress("localhost",9123));
	}
}

下面是TcpClientHandler的程式碼:

package com.minaTcpClient;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

public class TcpClientHandler extends IoHandlerAdapter{
    //會話建立時觸發
	public void sessionCreated(IoSession session) throws Exception {
        System.out.println("session  Created");
    }
	//會話開啟時觸發(第一次連線時先觸發sessionCreated函式,後觸發本函式)
	 public void sessionOpened(IoSession session) throws Exception {
	       session.write("Hello....");
	    }
	 //當接收到訊息時觸發
	 public void messageReceived(IoSession session, Object message) throws Exception {
		 System.out.println("收到:"+message.toString());
	        session.write("Received :"+message.toString());
	    }
}

寫完上面的程式碼後先啟動伺服器,讓後啟動客戶端。這個順序應該能理解。。。。。。

關於UDP協議

UDP協議的寫法是一樣的,MINA在一定程度上遮蔽了兩者的差異。

在編寫上只需要將IoService的實現類替換一下

伺服器端的NioSocketAcceptor替換為NioDatagramAcceptor

客戶端的NioSocketConnector替換為NioDatagramConnector

他們都是IoService的實現類。

相關推薦

Apache MINA框架入門

說明 NIO API是在Java 1.4引入的。MINA是基於NIO編寫的。首先要了解NIO與BIO的概念以及區別,NIO代表非阻塞IO,BIO代表著阻塞式IO。具體細節請百度。。。 MINA是一個簡單但功能齊全的網路應用框架(其實已經被NettyPK掉了,但都是一型別的

APACHE MINA2.0開發之一】搭建APACHE MINA框架並實現SERVER與CLIENT端的簡單訊息傳遞!

Hibernate系列學習階段到此結束了,那麼緊接著進入Apache Mina的開發學習,很多童鞋在微薄和QQ中疑問Himi為什麼突然脫離遊戲開發了,嘿嘿,其實可能更多的童鞋已經看出來了,Himi在偏向伺服器Server端開發了,Hibernate、MySQL等都是為了Server端Mina開發而做的

Apache MINA 框架之預設session管理類實現

protected final void doSetAll(IoSessionConfig config) { if (!(config instanceof SocketSessionConfig)) { return; } if

Apache MINA框架整合到Spring框架

畢業設計用到了Apache公司的MINA框架作為服務端與安卓客戶端的通訊框架。 問題:服務端分為兩個部分,一個是基於javaEE平臺的後臺管理系統,另一個是基於MINA框架的服務,整個專案中需求是當tomcat伺服器啟動的時候,將MINA服務也一起啟動起來,相當於服務端程式

使用Apache MINA框架搭建服務端

使用MINA框架搭建服務端步驟: 1、定義一個啟動服務的類MinaServer,並實現介面ServletContextListener 2、定義一個處理業務邏輯的類MinaServerHandler,並繼承類IoHandlerAdapter 類MinaServer程式碼如下

Apache Camel框架入門示例

Apache Camel是Apache基金會下的一個開源專案,它是一個基於規則路由和處理的引擎,提供企業整合模式的Java物件的實現,通過應用程式介面 或稱為陳述式的Java領域特定語言(DSL)來配置路由和處理的規則。其核心的思想就是從一個from源頭得到資料,通過pr

Apache MINA網路通訊框架

基本介紹: Apache MINA 2是一個開發高效能和高可伸縮性網路應用程式的網路應用框架。它提供了一個抽象的事件驅動的非同步API,可以使用TCP/IP、UDP/IP、串列埠和虛擬機器內部的管道等傳輸方式。Apache MINA 2可以作為開發網路應用程式的一個良好

Apache Mina 入門 (二)—— 非同步通訊機制

通過前面的Apache mina 入門(一)— 基礎知識 我們可以瞭解到 mina是個非同步通訊框架,一般使用場景是服務端開發,長連線、非同步通訊使用mina是及其方便的。不多說,看例子。 本次mina 使用的例子是使用maven構建的,過程中需要用到的ja

Apache Mina 2.0.x 入門

Apache Mina ,一個高效能 Java 非同步併發網路通訊框架。利用 Mina 可以高效地完成以下任務: TCP/IP 和 UDP/IP 通訊 串列埠通訊 VM 間的管道通訊 SSL/TLS JXM 整合 IoC 容器整合(

Apache mina 入門(四) —— 客戶端長連線方式實現斷線重連監聽

通過前面 Apache Mina 入門 (二)—— 非同步通訊機制 我們可以實現一個長連線的客戶端。但會發現一個問題,就是當網路、伺服器、應用程式出現問題而導致連線斷開後,我們的客戶端不能自動重連伺服器。導致客戶端程式癱瘓,不能使用。這個時候,通過增加一

長連接神器Mina框架的使用

clas rem 服務 bre json字符串 != bin write size 前段時間學習了mina框架的使用。它是基於Socket進行通信,所以說在項目中要是需要長連接的使用,那mina框架是一個不錯的選擇。 下面簡單介紹一下mina框架的使用,學習mina框架不長

Scrapy 爬蟲框架入門案例詳解

tin mon setting 爬蟲框架 finished perror project 原因 create 歡迎大家關註騰訊雲技術社區-博客園官方主頁,我們將持續在博客園為大家推薦技術精品文章哦~ 作者:崔慶才 Scrapy入門 本篇會通過介紹一

Java - Struts框架教程 Hibernate框架教程 Spring框架入門教程(新版) sping mvc spring boot spring cloud Mybatis

java ee cloud pac .cn java get pin nat 輕量級 https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html

Mina框架研究

顯示當前的時間 guide forname cfa services com pri 開發 監聽端口 Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 組織一個較新的項目,它

SpringMVC框架入門配置 IDEA下搭建Maven項目

eclipse 資源文件 比較 erl zip str c項目 下載 參觀 ,初衷:本人初學SpringMVC的時候遇到各種稀奇古怪的問題,網上各種技術論壇上的帖子又參差不齊,難以一步到位達到配置好的效果,這裏我將我配置的總結寫到這裏供大家初學SpringMVC的同僚們共同

Spring Security安全框架入門

ade todo -s 編寫 切面 yacc ttr username 環境 一、Spring Security相關概念 1.1.、Spring Security介紹: Spring Security是一個能夠為基於Spring的企業應用系統提供聲明

DWR3.0框架入門(3) —— ScriptSession的維護及優化

final comm scrip javax href run com stat creat 1.ScriptSession使用中存在的問題 在上一節實現了服務器的推送功能,但是根據 ScriptSession的生命周期我們可以得出以下幾點的問題:

Asp.Net Ioc框架入門之一 Unity

輕量級 practice 松耦合 table protected mic ret sof asp 一、概述   IOC:英文全稱:Inversion of Control,中文名稱:控制反轉,它還有個名字叫依賴註入(Dependency Injection)。  作用:將

ThinkJS框架入門詳細教程(一)開發環境

install devel 版本 開發 conf doc 瀏覽器 打開 變量 一、前端標配環境 1、nodeJS正確安裝,可以參考:http://www.cnblogs.com/chengxs/p/6221393.html 2、git正確安裝,可以參考:http://w

PHP Laravel框架入門心得

del 資源 route 基礎 bsp 框架 習慣 com 基礎上 PHP有不少開發框架,其中比較出名的有Symfony和Laravel。 我說說我最近入門Laravel的感受和學習方法吧。 1。第一個感受是Laravel的社區討論和學習資源真的是太棒了,中文化也