apache mina 2.x 菜鸟入门

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

Mina 同时提供了网络通信的Server 端、Client 端的封装,无论是哪端,Mina 在整个网通
通信结构中都处于中间位置,不不关心底层的网络数据如何传输,只负责接受底层数据,过滤并转换为java对象提供给我们的应用程序,然后应用程序响应值过滤并转换为底层识别的字节,提供给底层传输。总之,Mina是底层数据传输和用户应用程序交互的接口。

service side服务端的实现是 : IoAcceptor

client side 客户端的实现是:  IoConnector


几个重要的接口:


(1.) IoService:这个接口在一个线程上负责套接字的建立,拥有自己的Selector,监
听是否有连接被建立。 

(2.) IoProcessor:这个接口在另一个线程上负责检查是否有数据在通道上读写,也就是
说它也拥有自己的
Selector,这是与我们使用JAVA NIO 编码时的一个不同之处,
通常在
JAVA NIO 编码中,我们都是使用一个Selector,也就是不区分IoService
IoProcessor 两个功能接口。另外,IoProcessor 负责调用注册在IoService 
的过滤器,并在过滤器链之后调用
IoHandler
(3.) IoFilter
:这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、
数据的编码(
write 方向)与解码(read 方向)等功能,其中数据的encode decode
是最为重要的、也是你在使用
Mina 时最主要关注的地方。
(4.) IoHandler
:这个接口负责编写业务逻辑,也就是接收、发送数据的地方。

编写简单的服务端/客户端 通讯程序:

1.编写ServerMina.java

package com.tcpip.demo1;

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

import org.apache.mina.common.IoAcceptor;
import org.apache.mina.common.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class ServerMina {
	
	public static void main(String[] args) {
		/***
		 * 建立服务路端监听器的
		 * 在传统服务端编程中,对于一个 TCP 服务器,我们需要先建立一个监听套接字。在 Mina 中,我们创建的并不是一个监听套接字,
		 * 而是一个监听套接字工厂,或者称之为“监听器( acceptor )”。该概念映射到 Mina API 中,就是 IoAcceptor 接口
		 * 及其各个实现类。
		 */
		IoAcceptor acceptor = new NioSocketAcceptor();
		acceptor.setHandler(new ServerHandler());
		//设置文本编解码过滤器工厂
		acceptor.getFilterChain().addLast("codec", 
				new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("GBK"))));
		try {
			//设置绑定的端口 
			acceptor.bind(new InetSocketAddress(9923));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
2.编写处理消息的逻辑类ServerHandler.java
package com.tcpip.demo1;

import java.util.Date;

import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;

public class ServerHandler extends IoHandlerAdapter{

	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		session.close(true);
		cause.printStackTrace();
	}

	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		session.write("服务器已启动...");
		String msgStr = (String) message;
		if(msgStr.equalsIgnoreCase("quit")){
			session.write("谢谢使用!\n");		
			session.close(true);
		}
		System.out.println("Server端:收到client发送的字符串:"+msgStr);
	}

	@Override
	public void sessionClosed(IoSession session) throws Exception {
		System.out.println("session closed");
	}

	@Override
	public void sessionCreated(IoSession session) throws Exception {
		System.out.println("session Created");
	}

	@Override
	public void sessionIdle(IoSession session, IdleStatus status)
			throws Exception {
		super.sessionIdle(session, status);
	}

	@Override
	public void sessionOpened(IoSession session) throws Exception {
//		session.write(new Date());
		System.out.println("session Opened");
	}

	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
//		session.close(true);
	}
	
}

3.编写客户端ClientMina.java

package com.tcpip.demo1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.charset.Charset;

import org.apache.mina.common.IoConnector;
import org.apache.mina.common.IoFuture;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
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 ClientMina {

	static boolean flag = true;

	public static void main(String[] args) {
		// 客户端连接
		IoConnector connector = new NioSocketConnector();
		connector.getFilterChain().addLast(
				"codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("GBK"))));
		ClientHandler handler=new ClientHandler();
		connector.setHandler(handler);
		IoSession session = null; 
		IoFuture future = connector.connect(new InetSocketAddress("127.0.0.1", 9923));
		future.awaitUninterruptibly();
		session=future.getSession();
		session.getConfig().setUseReadOperation(true);
		session.write("我是客户端:huahua");//发送消息
		session.getCloseFuture().awaitUninterruptibly();
		connector.dispose();
	}
	
}
class ClientHandler extends IoHandlerAdapter{
	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		String msg = (String) message;
		System.out.println("Client端:收到Server返回的字符串:" + msg);
	}
}

4.运行。

   先运行ServerMina.java类,然后再运行ClientMina.java类。

但客户端启动后,ServerMina显示结果:

               session Created
               session Opened
              Server端:收到client发送的字符串:我是客户端:huahua

ClientMina显示结果:

              Client端:收到Server返回的字符串:服务器已启动...


用windows命令:telnet 127.0.0.1 9923 访问

   结果如图所示

当服务端接受到“quit”时,服务器自动与客户端断开连接


小结:使用apache mina框架网络编程,建立非阻塞是监听,高性能,高效率,面向接口编程,使用起来非常方便。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值