1.介绍
mina作为一个高度封装soket的网络应用框架(主要用于通信),在我们的实际项目中用的还是挺多的,这里将通过一个案例介绍下mina的基本开发包括Java后端以及android客户端的代码实现。同时将以实例的方式介绍心跳包实现的长连接。作为小白,我就不班门弄斧的将概念讲api了,仅仅是把代码给出案例给出,概念分析文末给出一些比较好的文章。
2.运行效果
对于这个结果我要先说明下:
客户端发送: ping ---> 服务端接受到ping并验证然后发送 pong ---> 客户端接受到pong 2次握手,验证非空闲
指出一点: 客户端会先发送验证请求,如果客户端发送了pong,但是服务端才发送ping 那么就无法验证非空闲了。当然有一点可以设置客户端的setRequestTimeOut() 晚一点,保证服务端发消息后客户端可以接收,但有弊端。

3.代码实现
服务端代码
这些代码大家百度mina都是能够搜索到的,我们只要知道大致的步骤是服务端分配特定的端口初始化服务端连接,设置handler进行各种处理然后添加自己需要的过滤器来实现log日志或者心跳包的功能。下面给出了部分代码,具体的代码后面会给出demo。
public class CTServer {
private static final int PORT = 8431;
public static void main(String[] args) throws IOException {
IoAcceptor acceptor = new NioSocketAcceptor();
TextLineCodecFactory lineCodec = new TextLineCodecFactory(Charset.forName("UTF-8"));
lineCodec.setDecoderMaxLineLength(1024*1024);
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(lineCodec));
// 设置handler
acceptor.setHandler(new CTServerHandler());
acceptor.getSessionConfig().setReadBufferSize(2048);
// 设置10没有读写进入空闲状态
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);
//心跳设置
KeepAliveMessageFactory heartBeatFactory = new KeepAliveMessageFactoryImpl();
KeepAliveFilter heartBeat = new KeepAliveFilter(heartBeatFactory,IdleStatus.BOTH_IDLE);
//设置的处理时间 超过240秒(4分钟则断开)则断开连接
// 还有一个细节: 就是服务器每隔1分钟(60)秒就会 Ping 客户端哦,
// 合起来就是300秒 5分钟了
heartBeat.setForwardEvent(true);
heartBeat.setRequestInterval(100);
heartBeat.setRequestTimeout(5);
//heartBeat.setRequestTimeout(240);
// 设置拦截器 设置自带的拦截器
acceptor.getFilterChain().addLast("heartbeat", heartBeat);
acceptor.bind(new InetSocketAddress(PORT));
System.out.println("Listening on the Port:" + PORT);
}
}
这是服务端实现的心跳,用于接受接受客户端发送过来的pong并反馈给客户端ping,来达到长连接的目的。
public class KeepAliveMessageFactoryImpl implements KeepAliveMessageFactory {
// 服务端向客户端做出的回应
private static final String HEARTBEATREQUEST = "ping";
// 服务端检测客户端信息-----
private static final String HEARTBEATRESPONSE = "pong";
// 判断是否是客户端发送过来的心跳请求包,是的话返回true
public boolean isRequest(IoSession session, Object message){
if (message.equals(HEARTBEATRESPONSE)){
System.out.println("isRequest "+HEARTBEATRESPONSE);
return true;
}
return false;
}
public boolean isResponse(IoSession session, Object message){
return false;
}
// 被动心跳
public Object getRequest(IoSession session){
return null;
}
/**
* 做出的回应是ping
* @param session
* @param request
* @return
*/
public Object getResponse(IoSession session, Object request){
System.out.println("服务端根据客户端做出了回应 = "+HEARTBEATREQUEST);
return HEARTBEATREQUEST;
}
}
android客户端核心代码
ConnectionConfig.java
public class ConnectionConfig {
private Context context;
priva

本文介绍了如何使用Mina框架在Android客户端和Java服务端之间建立长连接,并实现心跳包机制。通过服务端代码和Android客户端的核心代码示例,展示了连接过程和心跳包的处理。此外,提供了项目地址以及相关Mina文章链接,帮助初学者理解和应用Mina框架。
最低0.47元/天 解锁文章
3354

被折叠的 条评论
为什么被折叠?



