APP长连接的实现

编程入门 行业动态 更新时间:2024-10-21 06:36:00

<a href=https://www.elefans.com/category/jswz/34/1771370.html style=APP长连接的实现"/>

APP长连接的实现

一、说明

客户端和服务器端采用Apache的mina框架实现了APP的长连接

二、JAVA服务端

  1. 创建一个基于TCP/IP的非阻塞的server端的Socket
  2. 编写过滤器(使用mina提供的文本换行符编解码器)
  3. 设置读取数据的缓冲区大小
  4. 设置读写通道10秒内无操作进入空闲状态
  5. 为接收器设置管理服务
  6. 为Socket绑定端口

2.1长连接服务器端代码

public class Demo1Server {//日志类的实现private static Logger logger = Logger.getLogger(Demo1Server.class+"");//端口号,要求客户端与服务器端一致private static int PORT = 9088;public static void main(String[] args){IoAcceptor acceptor = null;try{//创建一个非阻塞的server端的Socketacceptor = new NioSocketAcceptor();//设置过滤器(使用mina提供的文本换行符编解码器)(在bind前进行)acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),LineDelimiter.WINDOWS.getValue(),LineDelimiter.WINDOWS.getValue())));//自定义的编解码器//acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new CharsetCodecFactory()));//设置读取数据的换从区大小acceptor.getSessionConfig().setReadBufferSize(2048);//读写通道10秒内无操作进入空闲状态acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);//为接收器设置管理服务acceptor.setHandler(new Demo1ServerHandler());//绑定端口acceptor.bind(new InetSocketAddress(PORT));logger.info("服务器启动成功...    端口号未:"+PORT);}catch(Exception e){logger.info("服务器启动异常..."+e.getMessage().toString());e.printStackTrace();}}
}

2.2管理服务代码

public class Demo1ServerHandler extends IoHandlerAdapter {public static Logger logger = Logger.getLogger(Demo1ServerHandler.class + "");// 从端口接受消息,会响应此方法来对消息进行处理@Overridepublic void messageReceived(IoSession session, Object message) throws Exception {String msg = message.toString();System.out.println(msg);if ("exit".equals(msg)) {// 如果客户端发来exit,则关闭该连接session.close(true);}// 向客户端发送消息Date date = new Date();session.write(date);logger.info("服务器接受消息成功..." + msg);super.messageReceived(session, message);}// 向客服端发送消息后会调用此方法@Overridepublic void messageSent(IoSession session, Object message) throws Exception {logger.info("服务器发送消息成功...");super.messageSent(session, message);}// 关闭与客户端的连接时会调用此方法@Overridepublic void sessionClosed(IoSession session) throws Exception {logger.info("服务器与客户端断开连接...");super.sessionClosed(session);}// 服务器与客户端创建连接@Overridepublic void sessionCreated(IoSession session) throws Exception {logger.info("服务器与客户端创建连接...");super.sessionCreated(session);}// 服务器与客户端连接打开@Overridepublic void sessionOpened(IoSession session) throws Exception {logger.info("服务器与客户端连接打开...");super.sessionOpened(session);}@Overridepublic void sessionIdle(IoSession session, IdleStatus status) throws Exception {logger.info("服务器进入空闲状态...");super.sessionIdle(session, status);}@Overridepublic void exceptionCaught(IoSession session, Throwable cause) throws Exception {logger.info("服务器发送异常...");super.exceptionCaught(session, cause);}}

三、Android客户端

  1. 创建一个基于TCP/IP的非阻塞的clinet端的Socket
  2. 编写过滤器(使用mina提供的文本换行符编解码器)
  3. 设置连接超时
  4. 为接收器设置管理服务
  5. 连接服务器

3.1长连接客户端代码

注意:
1. Android的网络操作放在子线程
2. 清单文件需要添加访问网络的权限

public class MinaThread extends Thread {private IoSession session = null;@Overridepublic void run() {// Create TCP/IP connector.IoConnector connector=new NioSocketConnector();//编写过滤器,设置编码connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),WINDOWS.getValue(),WINDOWS.getValue())));//设置超时connector.setConnectTimeoutMillis(30000);//为连接器设置管理服务connector.setHandler(new MinaClientHandler());//连接服务器connector.connect(new InetSocketAddress(ConstantUtil.IP_ADDRESS, ConstantUtil.PORT));}}

3.2管理服务代码

public class MinaClientHandler extends IoHandlerAdapter {//接收到来自服务端的消息@Overridepublic void messageReceived(IoSession session, Object message)throws Exception {String msg = message.toString();Log.d("TEST", "客户端接收到的信息为:" + msg);super.messageReceived(session, message);}@Overridepublic void sessionOpened(IoSession session) throws Exception {//向服务器端发送消息session.write("this is client");super.sessionOpened(session);}@Overridepublic void messageSent(IoSession session, Object message) throws Exception {super.messageSent(session, message);}@Overridepublic void exceptionCaught(IoSession session, Throwable cause)throws Exception {Log.d("TEST", "客户端发生异常");super.exceptionCaught(session, cause);}
}

4.工程链接

APP长连接工程地址_GitHub

更多推荐

APP长连接的实现

本文发布于:2024-03-08 08:18:23,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1720319.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:APP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!