博主近端时间在做一个项目,里面有个需求需要实现点对点可选择聊天,就像一个QQ一样。但是需求又没那么高大尚。似乎就只是一个简单的聊天。网上找了很多信息,最后决定使用MINA框架来实现。现在的IM通讯协议有一个叫XMPP的,博主一看,好像项目需求不需要那么复杂,于是博主根据实际需要自己定了一个简单的传输协议来实现。项目之前用的是openfire,但是聊天只是一个其中一个基础功能,还有其他需求,而且openfire有各种限制,不支持JDK1.7等。于是只能放弃使用它,自己来写一个通信服务器了。博主是做Android开发的,服务器端理应该是做服务器的人负责,无奈公司人手不够,项目又催的紧,服务器端还有很多其他的业务需要那个专业的人去做,于是,博主只好硬着头皮上了。查看了一下好像OPENFIRE好像就是在MINA的框架上基于XMPP协议写出来的,于是博主果断就去研究了MINA框架,搞了那么2天,还真被博主搞出来了。好了,废话不说了,言归正传。
MINA框架,是Apache组织应用程序(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。在这不在详细描述MINA框架的底层工作原理,直接进入实例开发,如果想看MINA框架的底层实现原理,请转接(博主就是看这篇文章学的):http://blog.csdn.net/w13770269691/article/details/8614584
一、MINA框架服务端开发
博主的项目的服务端是一个web项目,还有的业务,在这里博主将MINA框架部分剥离了出来,重新新建了一个项目。
1、MINA服务器编写:
package com.freedom.mina;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.log4j.Logger;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
/**
* @ClassName: Server
* @author victor_freedom (x_freedom_reddevil@126.com)
* @createddate Dec 14, 2014 11:25:40 PM
* @Description: TODO
*/
public class Server implements Runnable {
private final Logger logger = Logger.getLogger(Server.class);
public Thread start;
public Server() {
start = new Thread(this);
}
public void startService() {
System.out.println("MINA启动");
start.start();
}
public void stopService(){
System.out.println("MINA停止");
start.interrupt();
}
public void run() {
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(),
LineDelimiter.WINDOWS.getValue())));
acceptor.setHandler(new ServerHandler());
acceptor.getSessionConfig().setReadBufferSize(1024);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
try {
acceptor.bind(new InetSocketAddress(9090));
} catch (IOException e) {
logger
.error("Server start failed, Please check the network or port!");
}
logger.info("Server start up!");
}
}