apache mina第一发-初体验

闲来无事来一发博客,最近看了看apache mina,研究了下一些文档里的程序,今天在这里记录一下。

      简单介绍一下Apache Mina,Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。

       首先是开发环境的配置,我们需要在官网下载apache的jar包,可以直接把所有的jar包都加进build path中。另外,我们需要添加几个额外的包,可以在slf4j的官网上下载到,配置好后的build path如下图所示,阴影部分的包是上面说的需要另外下载的。


然后就是写我们的第一个程序了。首先是服务端的代码,MainServer类主要负责连接的建立

package mina.server;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;


public class MainServer {
	
	/**
	 * 程序入口
	 * @param args
	 */
	public static void main(String [] args){
		
		//创建一个非阻塞的Server端Socket
		SocketAcceptor acceptor = new NioSocketAcceptor();
		
		//创建接收数据的过滤器
		DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
		
		//设定这个过滤器将一行一行地读取数据
		chain.addLast("myChain", new ProtocolCodecFilter(new TextLineCodecFactory()));
		
		//设定服务器的消息处理器:一个MyHander对象
		acceptor.setHandler(new MyHandler());
		
		//设定服务器绑定的端口
		int bindPort=9988;
		
		//绑定端口,启动服务器
		try {
			acceptor.bind(new InetSocketAddress(bindPort));
		} catch (IOException e) {
			System.out.println("启动失败");
			e.printStackTrace();
		}
		
		System.out.println("Mina 已经在端口"+bindPort+"启动");
	}
}

 
 与Java中传统的I/O方式不同,Mina 走的是NIO的套路,Mina服务器中的ServerSocket叫做Acceptor,它在绑定端口号之前需要设置过滤器(与Java web中的过滤器十分相似),而且需要设置一个Handler,这个handler十分重要,处理消息的逻辑都是在它里面的。所有的Handler都需要实现IoHandler接口,或者继承它的实现类IoHandlerAdapter,并重写里面的方法,以下是MyHandler类

package mina.server;

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

public class MyHandler extends IoHandlerAdapter {

	/**
	 * 当一个客户端连接进入时
	 */
	public void sessionOpened(IoSession session) throws Exception{
		System.out.println("新接入的客户端"+session.getRemoteAddress());
	}

	/**
	 * 当一个客户端断开连接时
	 */
	public void sessionClosed(IoSession session){
		System.out.println("客户端断开连接");
	}
	
	/**
	 * 当有信息发来时
	 */
	public void messageReceived(IoSession session,Object message){
		
		String s = message.toString().trim();
		
		System.out.println("收到客户端发来的消息:"+s);
		
		session.write(s);
		count++;
	}
	
	private int count = 0;
}

我们在这里看到的三个方法都是重写的,Mina中把通信抽象成事件处理的机制,我们只需要编写对应的事件响应函数就好了。这里当我们的服务器收到一条消息之后,就把它原封不动地转发到客户端。

然后是客户端部分的代码

package mina.client;

import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
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.transport.socket.nio.NioSocketConnector;

public class MainClient {
	

	public static void main(String [] args) throws Exception{
		
		NioSocketConnector connector = new NioSocketConnector();
		
		DefaultIoFilterChainBuilder chain = connector.getFilterChain();
		
		chain.addLast("myChain", new ProtocolCodecFilter(new TextLineCodecFactory()));
		
		connector.setHandler(new MyClientHandler());
		
		connector.setConnectTimeout(30);
		
		ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",9988));
		
		cf.awaitUninterruptibly();
		
		cf.getSession().getCloseFuture().awaitUninterruptibly();
		
		connector.dispose();
	}
}
package mina.client;

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

public class MyClientHandler extends IoHandlerAdapter {

	public void sessionOpened(IoSession session) throws Exception{
		System.out.println("连接到服务器");
		session.write("我来了");
	}
	
	public void sessionClosed(IoSession session){
		System.out.println("与服务器断开连接");
	}
	
	public void messageReceived(IoSession session,Object message){
		String s = message.toString().trim();
		System.out.println("服务器发来的收到消息:"+s);
		session.write(s);
	}
}

 当客户端连接到服务器之后,就给服务器发一条“我来了”的消息,而当收到服务器发来的消息之后,就把它原封不动地转发到服务器。

   各位不妨想象一下程序运行的结果,然后动手试一试

最后总结一下用Mina写简单通信程序的流程:

服务器端:

1.新建SocketAcceptor

2.设置Filter链

3.编写并设置IoHandler

4,.绑定端口

客户机端:

1.新建SocketConnector

2.设置Filter链

3.编写并设置IoHandler

4.连接服务器

猜你喜欢

转载自ciciyin.iteye.com/blog/1869989
今日推荐