Mina是基於java nio實現的一套方便開發高性能遠程通信程序的框架。
官方學習文檔:https://mina.apache.org/mina-project/userguide/user-guide-toc.html
下面是實例一:簡單服務端實例
程序功能:將客戶端發送過來的消息打印出來, 並將當前時間發送回客戶端
首先新建項目,並加入Mina依賴 (本人創建的maven項目,如果不是maven項目,就去Mina官網下載相應的jar包)
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mina</groupId>
<artifactId>mina-test</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>mina-test</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.mina</groupId>
<artifactId>mina-core</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.6</version>
</dependency>
</dependencies>
</project>
接下來是服務端主程序
package com.zf.mina.test01;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
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 {
//使用IoAcceptor來接收客戶端的請求
IoAcceptor acceptor = new NioSocketAcceptor() ;
//加入內置的LoggingFilter,用戶打印出一個請求過程中的信息
acceptor.getFilterChain().addLast("logger", new LoggingFilter()) ;
//使用Mina提供的ProtocolCodecFilter來對消息進行編碼和解碼,使用Mina提供的TextLineCodecFactory對消息進行分行處理
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
//設置消息處理器,當接收到消息時,可以進行相應的業務操作
acceptor.setHandler(new TimeServerHandler()) ;
//配置Buffer大小
acceptor.getSessionConfig().setReadBufferSize(2048);
//如果Session在指定時間內沒有事情做(讀/寫),那麼就會觸發Handler的sessionIdle方法
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10) ;
//綁定好要監聽的端口
acceptor.bind(new InetSocketAddress(8080)) ;
}
}
消息處理器
package com.zf.mina.test01;
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;
/**
* Server端的消息處理器
* @author Administrator
*
*/
public class TimeServerHandler extends IoHandlerAdapter{
/**
* 當通信出現異常時會觸發該方法
*/
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
cause.printStackTrace() ;
}
/**
* 當接收到客戶端發來的消息時,此方法會被觸發
*/
public void messageReceived(IoSession session, Object message)
throws Exception {
String msg = message.toString() ; //獲取客戶端發來的消息
if(msg.trim().equalsIgnoreCase("quit")){
session.close(false) ;
System.out.println("Session closed");
return ;
}
System.out.println("收到客戶端消息:" + msg);
Date date = new Date() ;
session.write(date.toLocaleString() ) ; //將消息發送給客戶端
System.out.println("Message wittern...");
}
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
System.out.println("IDLE " + session.getIdleCount(status) );
}
}
此時服務端程序就編寫完成了。 現在可以啓動MinaTimeServer類了 。
然後打開命令行工具,輸入如下命令:
telnet localhost 8080
然後就可以輸入內容了。 隨便輸入什麼內容。 會看到會將客戶端輸入的內容輸出, 並且在客戶端會打印出當前系統時間