现在的位置: 首页 > 综合 > 正文

Mina的入门应用

2013年02月25日 ⁄ 综合 ⁄ 共 3617字 ⁄ 字号 评论关闭

初学mina网络通信的体会与心得

1、首先一起学习下mina是个什么东西?
Mina是Apache公司封装的一个高性能Java异步并发网络通讯框架。

2、怎么用?

这里首先要搞清楚,在Android里面和Java里面需要用到的mina包是不一样的,在Android创建工程时先导入包,我导入的包是:mina4android.jarslf4j-android-1.6.1-RC1.jar这两个包。在java工程里面我导入的包是:mina-core-2.0.4.jar
  、slf4j-api-1.6.4.jar和slf4j-nop-1.6.4.jar。 
这些包可以去Apache官网去下载。也可以去这我的博客资源直接下http://download.csdn.net/my

刚学习时网上有很多实例,复制过来在自己电脑上使用怎跑不起来,后来干脆自己按照那种网上提供例子的思路,用自己的方式去写,然后小结了下,不管是服务器还是客户端,都可以简化归结为三步:

第一步:创建连接对象:

IoAcceptor acceptor = new NioSocketAcceptor();      //服务端

IoConnector connector = new NioSocketConnector();  //客户端

第二步:给该连接对象设置处理对象:

MinaHandler handler = new MinaHandler ();

acceptor.setHandler(handler);                           //服务端

connector.setHandler(handler);       //客户端

第三步:绑定即将通信对象:

Acceptor.bind(new InetSocketAddress(PORT));           //服务端

connector.connect(new InetSocketAddress(IPPORT)); //客户端

注:蓝色带底线的语句是处理类,继承了IoHandlerAdapter,里面有自动接受和发送方法,这是mina特有的机制,完美封装,无需用代码调用,我们要做的是只是将数据通过IoBuffer写入到会话session里面去,或者从会话里面获取想要的数据。

小结:接触Mina差不多两天了,做出来一个简单的服务端和客户端通话的AndroidJava两套最初级的程序。中间走了不少弯路,不过感觉收获也不少.mina在网络通信这一块封装太好了,实现了逻辑和业务的分离。在这里我只是实现了最初级应用,甚至过滤器都没有添加,还有很多深层次的应用等去学习。

java代码:

服务端:

public class ServerOne
{
static ServerHandler handler;

public static void main(String[] args) throws IOException
{
IoAcceptor acceptor = new NioSocketAcceptor();
handler = new ServerHandler();
acceptor.setHandler(handler);
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.bind(new InetSocketAddress(1234));
new Thread(new Runnable()
{
public void run()
{
while (true)
{
BufferedReader in = new BufferedReader(
new InputStreamReader(System.in));
try
{
String msg = in.readLine();
byte[] send = msg.getBytes();
IoBuffer io = IoBuffer.allocate(send.length);
io.clear();
io.put(send);
io.flip();
handler.session.write(io);
System.out.println("client:\n" + new String(send));
} catch (IOException e)
{

e.printStackTrace();
}
}
}
}).start();
}
}

class ServerHandler extends IoHandlerAdapter
{

IoSession session;

public void exceptionCaught(IoSession session, Throwable cause)
throws Exception
{

super.exceptionCaught(session, cause);
}

@Override
public void messageReceived(IoSession session, Object message)
throws Exception
{
IoBuffer io = (IoBuffer) message;
int length = io.limit();
byte[] buf = new byte[length];
io.get(buf);
System.out.println("server:\n" + new String(buf));
}

public void sessionOpened(IoSession session) throws Exception
{
System.out.println("连接成功,可以通话啦!");
this.session = session;
super.sessionOpened(session);
}
}

客户端:

public class ClientOne
{
public static void main(String[] args)
{
IoConnector connector = new NioSocketConnector();
connector.getSessionConfig().setReadBufferSize(1024);
final ClientHandler handler = new ClientHandler();
connector.setHandler(handler);
connector.connect(new InetSocketAddress("192.168.1.107", 1234));

new Thread(new Runnable()
{
public void run()
{
while (true)
{

BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
String writer;
try
{
writer = br.readLine();
byte[] send = writer.getBytes();
IoBuffer buffers = IoBuffer.allocate(send.length);
buffers.put(send);
buffers.flip();
System.out.println("send:\n" + new String(send));
handler.session.write(buffers);
} catch (IOException e)
{
e.printStackTrace();
}
}
}
}).start();
}
}

class ClientHandler extends IoHandlerAdapter
{

static IoSession session;

public void messageReceived(IoSession session, Object message)
throws Exception
{
IoBuffer io = (IoBuffer) message;
int length = io.limit();
byte[] buf = io.array();
byte[] tembuf = new byte[length];
System.arraycopy(buf, 0, tembuf, 0, length);
System.out.println("receive:\n" + new String(tembuf));
}

public void sessionOpened(IoSession session) throws Exception
{
this.session = session;

super.sessionOpened(session);
}

public void exceptionCaught(IoSession session, Throwable cause)
throws Exception
{
System.out.println("cause=====" + cause.toString());
super.exceptionCaught(session, cause);
}
}

抱歉!评论已关闭.