MINA 学习记录(一)

/

做为一个程序员或多或少都有接触过网络通信,如果这个感觉这个范畴过大那就说Socket。说大点就当你访问其他的计算机就用到了网络。如果脱离网络那么计算机的功能恐怕就只能做计算了。

网络通信能做那些事?

  1. 浏览网页
  2. 收发邮件
  3. 玩网络游戏
  4. ...

那么作为一个程序员那么需要关心就是Socket这层,因为大多语言都提供了网络通信的库,不如Java里面 java.net的包下面的内C#System.Net,C socket.c 这些库都对底层的通信进行了封装,只需简单的查看示例代码就可能以上手了

比如Java Java socket(TCP)学习记录

但是Java里面一般不直接使用SocketServer做服务端程序,因为原生的SocketServer是堵塞导致效率不好(甚至在这之前还看有文章直接说不应该使用Java的Socket做网络通信,应该是那个作者当时使用还是v1.5以前的JDK吧。)在JDK1.5后Java提供了NIO。比如tomcat,jetty 这些webServer都用到了。按照常规思维在网上了一下Java网络通信的包,发现还是有一些做的不错的库MINA,Netty。这2者关系还密切的。前者是Apache官方在进行维护(更新慢),后者由开源社区在维护。于是就选择一个相对稳定的MINA


正文


按常规来先到Apache下载一个
MINA官网 Apache MINA是一个网络应用程序框架,它可以帮助用户开发的高性能、高扩展性的网络应用程序。它提供了一个抽象的事件驱动的异步API在不同传输TCP/IP,UDP/IP 基于Java NIO。`

建议同时下载下src的,里面有一个

mina-example 里面有一些基础的代码可以快速上手。

client

package com.fzb.test.mina;

import java.net.InetSocketAddress;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.SocketSessionConfig;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

public class TcpClient extends IoHandlerAdapter{

	private IoConnector connector;
	private IoSession session;
	
	public TcpClient() {
		connector = new NioSocketConnector();

        connector.setHandler(this);
        SocketSessionConfig dcfg = (SocketSessionConfig) connector.getSessionConfig();

        ConnectFuture connFuture = connector.connect(new InetSocketAddress("localhost", TcpServer.PORT));
        //等待与服务端建立连接
        connFuture.awaitUninterruptibly();
        
        session = connFuture.getSession();
	}
	
	public static void main(String[] args) {
		TcpClient tcpClient=new TcpClient();
		String first="Hello MINA";
		IoBuffer buffer = IoBuffer.allocate(first.getBytes().length);
        buffer.put(first.getBytes());
        buffer.flip();
        //MINA 默认支持的IoBuffer,使用write其他数据结构会导致MINA无法识别,数据就无法发送
		tcpClient.session.write(buffer);
	}
}

server

package com.fzb.test.mina;

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

import org.apache.mina.core.buffer.AbstractIoBuffer;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class TcpServer extends IoHandlerAdapter{

	public static final int PORT=6058;
	
	public TcpServer() {
		NioSocketAcceptor acceptor=new NioSocketAcceptor();
		try {
			acceptor.setHandler(this);
			acceptor.bind(new InetSocketAddress(PORT));
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		System.out.println("messageReceived "+new String(((AbstractIoBuffer)message).array()));
	}
	
	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
		// TODO Auto-generated method stub
		super.messageSent(session, message);
	}
	
	public static void main(String[] args) {
		new TcpServer();
	}

}

上面2端简单实现了客户端主动发送一句话到服务端。
通过简单的比对可以发现,在代码的编写过程中不需要关心Socket相关的代码。更多是需要自己去实现

exceptionCaught(IoSession session, Throwable cause)
messageReceived(IoSession session, Object message)
messageSent(IoSession session, Object message)
sessionClosed(IoSession session)
sessionCreated(IoSession session)
//回话被闲置的被调用。
sessionIdle(IoSession session, IdleStatus status)
sessionOpened(IoSession session)

这几个方法来完成Socket状态的监听。这样就减少了代码中需要各种监听才能处理业务代码的问题。


the next

mina 核心代码分析

转载请注明作者和出处,并添加本页链接。
原文链接: //xiaochun.zrlog.com/mina-first.html