MINA 学习记录(一)
做为一个程序员或多或少都有接触过网络通信,如果这个感觉这个范畴过大那就说Socket。说大点就当你访问其他的计算机就用到了网络。如果脱离网络那么计算机的功能恐怕就只能做计算了。
网络通信能做那些事?
- 浏览网页
- 收发邮件
- 玩网络游戏
- …
那么作为一个程序员那么需要关心就是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
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
转载请注明作者和出处,并添加本页链接。
原文链接:
//xiaochun.zrlog.com/mina-first.html