项目中遇到一个需求,需要安卓多客户端连接java后台进行相互通信,保持长连接,所以想到用socket来做,在网上看了一堆资料后,发现了mina框架,下面把自己整合的代码记录一下。

jar包自己在网上找,这里就不贴了

1、首先创建一个线程类,创建服务端的socket并且绑定指定的端口

public class SocketTest implements Runnable{//日志类的实现private static Logger logger = Logger.getLogger(SocketTest.class+"");//端口号,要求客户端与服务器端一致private static int PORT = 9088;@Overridepublic void run() {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 SocketHandlerTest());//绑定端口acceptor.bind(new InetSocketAddress(PORT));logger.info("服务器启动成功...    端口号未:"+PORT);}catch(Exception e){logger.info("服务器启动异常..."+e.getMessage().toString());e.printStackTrace();}}}

2、然后创建监听器,在项目启动的同时启动socket服务,等待客户端连接

public class InitListener implements ApplicationListener<ContextRefreshedEvent>{//日志类的实现private static Logger logger = Logger.getLogger(InitListener.class+"");@Overridepublic void onApplicationEvent(ContextRefreshedEvent arg0) {logger.info("执行监听器...");new Thread(new SocketTest()).start(); }}

3、最后编写处理类继承IoHandlerAdapter对socket进行管理

public class SocketHandlerTest extends IoHandlerAdapter{public static Logger logger = Logger.getLogger(SocketHandlerTest.class + "");// 从端口接受消息,会响应此方法来对消息进行处理@Overridepublic void messageReceived(IoSession session, Object message) throws Exception {String msg = message.toString();    System.out.println(msg);String m = (String) session.getAttribute("clientIP");logger.info(m);/*   //展现解析json得到的值StringBuffer buf = new StringBuffer();       try {//解析传递的jsonObjectMapper mapper = new ObjectMapper();JsonNode rootNode = mapper.readTree(msg);} catch (Exception e) {// TODO: handle exception}*/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("服务器与客户端创建连接...");IoSessionTest.session=session;String clientIP =  ((InetSocketAddress)session.getRemoteAddress()).getAddress().getHostAddress();session.setAttribute("clientIP", clientIP);logger.info(clientIP);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);}}

这样服务端也可以主动发消息给客户端,对MINA包下的IoSession进行操作,可以实现多客户端连接且保持长连接的需求

java整合Apache-mima进行socket通信相关推荐

  1. Springboot整合Netty,实现Socket通信

    文章目录 *Springboot整合Netty,实现Socket通信* 1.模拟单客户端 2.模拟单服务端 总结 Springboot整合Netty,实现Socket通信 1.模拟单客户端 引入Net ...

  2. java面试题44关于 Socket 通信编程,以下描述正确的是:( )

    java面试题44关于 Socket 通信编程,以下描述正确的是:( ) A 客户端通过new ServerSocket()创建TCP连接对象 B 客户端通过TCP连接对象调用accept()方法创建 ...

  3. java与C语言之间socket通信(java客户端 C服务端)

    直接贴代码 服务端C代码 server.c #include <stdio.h> #include <sys/types.h> #include <sys/socket. ...

  4. java与c/c++进行socket通信的一些问题

    c/c++和java通信的问题比较多,特别是c特有的数据结构(如struct). 特地根据网友的一个问题举个例子,希望对初学者有所帮助. 这类问题通常是为了利用原有Server或者Server不能做修 ...

  5. java事件 socket_java中有关socket通信的学习笔记

    最近做的项目中使用到了一些基于java的socket长连接的一些功能,用来穿透有关行业的网闸.用到了也就学习了一下,下面是对学习内容的一个笔记,记录一下也希望有兴趣的同学可以参考一下,加深对javas ...

  6. java客户端服务器代码_Java Socket通信 客户端服务器端基本代码

    [服务器端] import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import ...

  7. java与c/c++进行socket通信的一些问题(2)

    import java.net.*; import java.io.*; /** * 与C语言通信(java做Client,c/c++做Server,传送一个结构) * @author kingfis ...

  8. java与c 通信_Java与C之间的socket通信

    最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少 ...

  9. java socket建立长连接_Java Web项目中使用Socket通信多线程、长连接的方法

    很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接 ...

  10. Java Socket实战之六 使用NIO包实现Socket通信

    2019独角兽企业重金招聘Python工程师标准>>> 本文地址:http://blog.csdn.net/kongxx/article/details/7288896 Java S ...

最新文章

  1. js的全部替换函数replaceAll
  2. java 日志输出 log4j 简介
  3. 关于C/S模式开发的学习笔记
  4. python升维方法_python机器学习12:数据“升维”
  5. To-do-List
  6. C++类的组合和前向引用
  7. 在SharePoint2007中创建站点一:相关服务的启动
  8. OC-NSArray
  9. go.js中的图标(icons)的使用
  10. 论文编写时,如何添加参考文献索引
  11. 【STM32】 定时器---正交解码编码器模式详解
  12. Linux 命令(99)—— dirname 命令
  13. Unity之如何使用夜神模拟器logcat
  14. 快应用实现网络测速功能_网络阅卷系统应用系统功能实现情况
  15. matlab 概率论,matlab.概率论.doc
  16. 让用户输入一个月份,判断这个月是哪个季节?
  17. 数据库系统概论第五版(第 5 章 数据库完整性)笔记
  18. 尚硅谷大数据Spark之RDD转换算子学习笔记及面试题
  19. uniapp微信支付方案
  20. 打印机驱动开发,初步了解

热门文章

  1. c 常用数据结构解析
  2. 关于nodejs发送带参数的post请求调用人人网api
  3. Silane-PEG-FITC 硅烷聚乙二醇荧光素FITC-PEG-Silane在医疗设备领域有广泛应用,具有很好的生物相容性。
  4. C#开发之——控件简介(12.6)
  5. 浴火重生,燃起奋斗的欲望
  6. 搬砖:void (*signal(int sinno,void(*func)(int)))(int) 函数指针
  7. vim E486不存在::wq 错误笔记
  8. 数据分析_python数据可视化(基于matplotlib+pandas)
  9. 解除带宽限速,提升电脑网速
  10. 半加器、全加器及其应用