Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。
具体类可参考 http://www.cnblogs.com/xuekyo/archive/2013/03/06/2945826.html
可自定义编码,解码。小精灵手表用的协议为google的protocol buffer,所以需要在消息之前加4个字节,具体可参照小精灵项目和自己写的demo。
mina与服务器连接,需要不断向服务器发送心跳(自己定义的消息),用来判断客户端是否连接着,如果他超过几分钟不发,服务器判断他不在线,会断开连接。
但是有可能心跳服务会挂,导致客户端断开连接,所以,还需要开启一个服务,用来检测心跳是否发送。如果不发送,则这个服务或重新发送心跳。来保持一直在线。但是还是架不住服务会挂。
mina可能会报socket异常,这个异常是由于网络切换导致的,具体解决办法现在找不到。
服务器开启socket:
IoAcceptor ioAcceptor = new NioSocketAcceptor();
ioAcceptor.getFilterChain().addLast("logger", new LoggingFilter());
ioAcceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
ioAcceptor.setHandler(new DemoHandler());
ioAcceptor.getSessionConfig().setReadBufferSize(2048);
ioAcceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);// 10秒空闲
try {
ioAcceptor.bind(new InetSocketAddress(9238));
} catch (IOException e) {
e.printStackTrace();
}
}
static class DemoHandler extends IoHandlerAdapter{
//创建
@Override
public void sessionCreated(IoSession session) throws Exception {
// TODO Auto-generated method stub
super.sessionCreated(session);
}
//打开
@Override
public void sessionOpened(IoSession session) throws Exception {
// TODO Auto-generated method stub
super.sessionOpened(session);
}
//接收
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
// TODO Auto-generated method stub
super.messageReceived(session, message);
String mess = message.toString();
System.out.println("message---"+mess);
//返回给客户端
session.write(new Date()+"");
}
//发送
@Override
public void messageSent(IoSession session, Object message)
throws Exception {
// TODO Auto-generated method stub
super.messageSent(session, message);
}
//关闭
@Override
public void sessionClosed(IoSession session) throws Exception {
// TODO Auto-generated method stub
super.sessionClosed(session);
}
客户端创建socket: