MINA 学习记录(一)

/ 2015-07-05

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

网络通信能做那些事?

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

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

比如JavaJava 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

  1. package com.fzb.test.mina;
  2. import java.net.InetSocketAddress;
  3. import org.apache.mina.core.buffer.IoBuffer;
  4. import org.apache.mina.core.future.ConnectFuture;
  5. import org.apache.mina.core.service.IoConnector;
  6. import org.apache.mina.core.service.IoHandlerAdapter;
  7. import org.apache.mina.core.session.IoSession;
  8. import org.apache.mina.transport.socket.SocketSessionConfig;
  9. import org.apache.mina.transport.socket.nio.NioSocketConnector;
  10. public class TcpClient extends IoHandlerAdapter{
  11. private IoConnector connector;
  12. private IoSession session;
  13. public TcpClient() {
  14. connector = new NioSocketConnector();
  15. connector.setHandler(this);
  16. SocketSessionConfig dcfg = (SocketSessionConfig) connector.getSessionConfig();
  17. ConnectFuture connFuture = connector.connect(new InetSocketAddress("localhost", TcpServer.PORT));
  18. //等待与服务端建立连接
  19. connFuture.awaitUninterruptibly();
  20. session = connFuture.getSession();
  21. }
  22. public static void main(String[] args) {
  23. TcpClient tcpClient=new TcpClient();
  24. String first="Hello MINA";
  25. IoBuffer buffer = IoBuffer.allocate(first.getBytes().length);
  26. buffer.put(first.getBytes());
  27. buffer.flip();
  28. //MINA 默认支持的IoBuffer,使用write其他数据结构会导致MINA无法识别,数据就无法发送
  29. tcpClient.session.write(buffer);
  30. }
  31. }

server

  1. package com.fzb.test.mina;
  2. import java.io.IOException;
  3. import java.net.InetSocketAddress;
  4. import org.apache.mina.core.buffer.AbstractIoBuffer;
  5. import org.apache.mina.core.service.IoHandlerAdapter;
  6. import org.apache.mina.core.session.IoSession;
  7. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
  8. public class TcpServer extends IoHandlerAdapter{
  9. public static final int PORT=6058;
  10. public TcpServer() {
  11. NioSocketAcceptor acceptor=new NioSocketAcceptor();
  12. try {
  13. acceptor.setHandler(this);
  14. acceptor.bind(new InetSocketAddress(PORT));
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. @Override
  20. public void messageReceived(IoSession session, Object message)
  21. throws Exception {
  22. System.out.println("messageReceived "+new String(((AbstractIoBuffer)message).array()));
  23. }
  24. @Override
  25. public void messageSent(IoSession session, Object message) throws Exception {
  26. // TODO Auto-generated method stub
  27. super.messageSent(session, message);
  28. }
  29. public static void main(String[] args) {
  30. new TcpServer();
  31. }
  32. }

上面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