`
shuofenglxy
  • 浏览: 194485 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MINA入门介绍

    博客分类:
  • MINA
阅读更多

 apache mina是一款可用于开发高性能和高伸缩性网络应用的框架,全称是Multipurpose Infrastructure for Network Applications。主要是基于TCP/IP或者是UDP/IP协议,其高性能主要利用Java NIO的非阻塞式复用通道。mina框架主要包括这么几个核心部分,一个  connector(连接server端用,这个非必须,可以用telnet来远程访问server端),一个acceptor(响应客户端请求用),一个Iohandler(业务数据处理用),一个IoFilterChain(主要用来完成日志记录,协议转换和其他一些需求)。大概业务员过程如下图:具体图不知道怎么上传,具体可以看http://shuofenglxy.blog.163.com/blog/static/172625123201101110727115/ 这个地址,也是我的blog


来看一个比较简单的demo来看看到底mina是怎么work.在看demo之前,先要准备好环境,这个应用主要需要下面的四个jar包: mina-core-2.0.2.jar ,slf4j-api-1.5.11.jar , slf4j-jcl-1.5.8.jar以及commons-logging-1.0.3.jar。


demo示例如下:


server端:

 

package minaDemo;

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.ProtocolCodecFactory;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class MessageSendServer {
	private static final int port = 11111;
	public static void main(String[]args) throws IOException{
		//服务端监听端口用 
		IoAcceptor acceptor = new NioSocketAcceptor();
		//日志filter
		acceptor.getFilterChain().addLast("logger", new LoggingFilter());
		//对象序列化工厂,用来将java对象序列化成二进制流
		acceptor.getFilterChain().addLast(
				"Objectcodec",
				new ProtocolCodecFilter(
						(ProtocolCodecFactory) new ObjectSerializationCodecFactory()));
		//业务处理handler
		acceptor.setHandler(new ServerHandler());
		//设置监听端口
		acceptor.setDefaultLocalAddress(new InetSocketAddress(port));
		//开启了监听accptor
		acceptor.bind();
		
		System.out.println("Server starts to listen to PORT :"+port);
		
	}
	
}
   


serer handler类:

 

 

package minaDemo;

import org.apache.mina.core.future.WriteFuture;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import java.util.*;
public class ServerHandler extends IoHandlerAdapter{
	
	@Override
	public void messageReceived(IoSession session,Object message)throws Exception{
		
		Message receivedMsg = (Message)message;
		if("quit".equalsIgnoreCase(receivedMsg.getContent())){
			System.out.println("Session closed");
			session.close(true);
		}
		receivedMsg.setContent("Server response :"+receivedMsg.getContent());
		
		receivedMsg.setDate(Calendar.getInstance().getTime());
		
		WriteFuture future = session.write(receivedMsg);
		future.awaitUninterruptibly();
		
		System.out.println("Successfully response to "+session.getRemoteAddress().toString());
	}
	@Override
	public void exceptionCaught(IoSession session, Throwable cause)throws Exception{
		session.close(true);
	}
}



这个server handler中主要用来处理的业务方法是messageReceived。
主要完成拿到message后做一个简单的消息内容更改然后返回这个消息给客户端。 


客户端和服务端类似的代码:

 

package minaDemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.Calendar;

import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.future.WriteFuture;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFactory;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
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 MessageSendClient {

	public static void main(String[] args) throws IOException, InterruptedException {
		
		NioSocketConnector connector = new NioSocketConnector();
		connector.getFilterChain().addLast("logger", new LoggingFilter());
		connector.getFilterChain().addLast(
				"Objectcodec",
				new ProtocolCodecFilter((ProtocolCodecFactory) new ObjectSerializationCodecFactory())); 
		connector.setConnectTimeoutMillis(3000);
		connector.setHandler(new ClientHandler());
		ConnectFuture cf = connector.connect(new InetSocketAddress("127.0.0.1",
				11111));
	
		cf.awaitUninterruptibly();
		
		IoSession session = cf.getSession();
		BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));
		long count =0;
		while(true){
			String input =systemIn.readLine();
			Message msg = new Message();
			if(input==""||"quit".equalsIgnoreCase(input.trim())){
				msg.setContent(input);
				WriteFuture future =session.write(msg);
				future.awaitUninterruptibly(3000);
				System.out.println("send quit cmd successfully");
				session.getCloseFuture().awaitUninterruptibly();
				connector.dispose();
				System.exit(0);
			}
			
			msg.setContent(input);
			msg.setId(count);
			msg.setDate(Calendar.getInstance().getTime());
			count++;
			WriteFuture future = session.write(msg);
			future.awaitUninterruptibly(3000);
			System.out.println("send "+msg.getId()+ "  successfully");
			Thread.sleep(10000);
		}
		
	}
}
 

 

客户端handler:

 

 

package minaDemo;

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

public class ClientHandler extends IoHandlerAdapter{

	@Override
	public void messageReceived(IoSession session, Object message)
	throws Exception {
			Message m = (Message)message;
			System.out.println(m.getId()+" "+m.getContent()+" "+m.getDate());
	}
	
	@Override
	public void exceptionCaught(IoSession session, Throwable cause)throws Exception{
		session.close(true);
	}
}
 



通过以上简单的代码 一个简单的c/s通信demo就完成了。这里面全部是采用了mina的相关接口来实现。接下来几篇文章会用来分析mina的线程模式,IofilterChain,ProtocalFactory这几个比较重要的点。

 

2
0
分享到:
评论

相关推荐

    Apache Mina入门(完成版)

    在“Apache Mina入门(完成版)”这份资料中,你将了解到以下关键知识点: 1. **Mina架构**:Mina的核心设计理念是事件驱动和异步通信,它采用了I/O多路复用技术,如Java NIO(非阻塞I/O),以提高服务端处理大量...

    mina入门实例

    这就是一个基础的Mina入门实例,展示了如何使用Mina进行客户端-服务器间的通信。随着深入学习,你可以了解更多的Mina特性,如心跳机制、多线程处理、会话管理等,以构建更复杂、高效的网络应用。

    mina入门例子

    本入门例子将带你了解如何使用MINA进行基本的网络通信应用开发。 首先,MINA的核心概念包括`Session`、`Filter`和`Handler`。`Session`代表一个网络连接,它是数据传输的通道;`Filter`是处理`Session`中数据的...

    Mina框架入门介绍

    Apache Mina 框架是一个强大的网络通信框架,它的核心目标是简化开发高效且可扩展的网络应用程序。Mina 提供了基于事件驱动和异步IO的编程模型,特别是利用了Java NIO作为其默认的底层支持,这使得开发者能够构建高...

    Apache Mina 入门Demo

    通过深入学习和实践这个Apache Mina入门Demo,你将掌握如何利用Mina构建网络应用,并了解其核心特性和工作原理,这对于从事Java网络编程或者需要处理大规模并发连接的开发者来说是非常有价值的。

    Mina入门:mina版之HelloWorld

    **Mina入门:Mina版之HelloWorld** Apache Mina是一个开源项目,它提供了一个高度模块化、高性能的网络通信框架。Mina旨在简化网络应用的开发,支持多种传输协议,如TCP、UDP、HTTP、FTP等。在这个“Mina入门:Mina...

    apache mina详细介绍,适合新手入门mina

    ### Apache Mina 详解 ...Apache Mina 是一个强大且灵活的网络通信框架,非常适合初学者入门使用。通过本篇文档的学习,希望读者能够对 Mina 的基本原理和使用方法有一个全面的认识,并能够在实际项目中灵活运用。

    ApacheMina入门(完成版)

    总之,Apache Mina为Java开发者提供了一个强大、灵活的网络通信框架,通过本文档中的"Apache Mina入门(完成版).pdf",你可以系统性地学习如何使用它来构建高效稳定的网络应用。通过实践和理解,你将能够熟练地驾驭...

    Apache+Mina入门基础

    mina是一种高效的互联网网络通信架构,此资料为入门基础。

    mina 入门 教程

    3. **Mina入门步骤** - **设置环境**:首先,你需要在项目中引入Mina的依赖库,通常是通过Maven或Gradle来管理。 - **创建ProtocolCodecFactory**:定义数据编码和解码的规则,以便Mina可以正确处理网络传输的数据...

    Apache mina框架入门教程

    Apache Mina 框架是一个强大的网络通信应用框架,它主要针对基于TCP/IP和UDP/IP的协议栈,同时也支持Java对象序列化和其他通信方式。Mina 的核心设计目标是帮助开发者快速构建高性能、高可扩展性的网络应用。它采用...

    MINA_API+MINA_DOC+mina

    MINA (Java IO Network ...总的来说,这个压缩包为初学者提供了一套完整的MINA学习资源,涵盖了理论知识、API详解和实战指导,有助于开发者快速入门并精通MINA框架,从而在实际工作中实现高效、稳定的网络通信应用。

    Mina入门程序

    《Mina入门程序详解》 Mina(全称Apache MINA,即Multi-purpose Infrastructure for Network Applications)是一个开源的网络通信框架,它为Java开发者提供了一种高性能、易使用的网络编程工具。Mina允许开发者创建...

    Mina 2.0快速入门与源码解析

    ### Mina 2.0快速入门与源码解析 #### Mina 2.0 快速入门 Mina 2.0 是一个基于Java NIO技术的高效、可伸缩的网络通信框架,广泛应用于服务器端开发。Mina 2.0 的设计目标是为开发者提供一个易于使用的API,使得...

    MINA2.0入门教程(适合刚接触的人)

    MINA2.0入门教程(适合刚接触的人)

Global site tag (gtag.js) - Google Analytics