Mina學習筆記(一) 簡單服務端實例

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 

然後就可以輸入內容了。 隨便輸入什麼內容。 會看到會將客戶端輸入的內容輸出, 並且在客戶端會打印出當前系統時間



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章