问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android上的socket通信的开源框架有哪些

发布网友 发布时间:2022-04-20 07:36

我来回答

1个回答

热心网友 时间:2022-04-15 01:02

请去360手机助手下载android学习手册里面有例子、源码和文档

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。目前正在使用 MINA 的软件包括有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、Openfire 等等。

以上是从网上找到的mina框架简单介绍。
由于正在开发的项目中要求加入及时通信功能(游戏方面),所以在网上找了好几种框架,像openfire、tigase等都是基于Xmpp协议开发的优秀框架。但这些侧重于消息的推送,不适合游戏上的简单交互。所以后来找到了mina这个框架,顺手搭建起来。接下来就是这几天学习的总结了,文章里面没有涉及到逻辑层的方面,只是简单的实现即时通信功能。资源下载我会放在文章的最后面。

一、相关资源下载

(1)Apache官方网站:http://mina.apache.org/downloads.html

 (2) Android用jar包(包括官网的资源,我会一律放在百度网盘下)

 

二、Mina简单配置

服务器端一共要用到四个jar包,包括一个日志包。将他们放在lib中,并加载进去
分别为 mina-core-2.0.7.jar  slf4j-log4j12-1.7.6.jar  slf4j-api-1.7.6.jar  log4j-1.2.14.jar(日志管理包)

如果要使用日志的jar包,则要在项目的src目录下新建一个log4j.properties,添加内容如下:

log4j.rootCategory=INFO, stdout , R  
 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n  
   
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender  
log4j.appender.R.File=D:\\Tomcat 5.5\\logs\\qc.log  
log4j.appender.R.layout=org.apache.log4j.PatternLayout  
1log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n  
 
log4j.logger.com.neusoft=DEBUG  
log4j.logger.com.opensymphony.oscache=ERROR  
log4j.logger.net.sf.navigator=ERROR  
log4j.logger.org.apache.commons=ERROR  
log4j.logger.org.apache.struts=WARN  
log4j.logger.org.displaytag=ERROR  
log4j.logger.org.springframework=DEBUG  
log4j.logger.com.ibatis.db=WARN  
log4j.logger.org.apache.velocity=FATAL  
 
log4j.logger.com.canoo.webtest=WARN  
 
log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN  
log4j.logger.org.hibernate=DEBUG  
log4j.logger.org.logicalcobwebs=WARN  

log4j.rootCategory=INFO, stdout , R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=D:\\Tomcat 5.5\\logs\\qc.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
1log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

log4j.logger.com.neusoft=DEBUG
log4j.logger.com.opensymphony.oscache=ERROR
log4j.logger.net.sf.navigator=ERROR
log4j.logger.org.apache.commons=ERROR
log4j.logger.org.apache.struts=WARN
log4j.logger.org.displaytag=ERROR
log4j.logger.org.springframework=DEBUG
log4j.logger.com.ibatis.db=WARN
log4j.logger.org.apache.velocity=FATAL

log4j.logger.com.canoo.webtest=WARN

log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
log4j.logger.org.hibernate=DEBUG
log4j.logger.org.logicalcobwebs=WARN

Android客户端要加入的jar包:mina-core-2.0.7.jar  slf4j-android-1.6.1-RC1.jar 两个jar包(可能直接使用上面的jar包也会行,我没试过~)

二、Mina服务端

我这边使用的是mina2.0版本,所以可能与mina1.0的版本有所不同。那么首先在服务器端创建开始

新建一个Demo1Server.class文件,里面包含着程序的入口,端口号,Acceptor连接.

1 public class Demo1Server {
2     //日志类的实现
3     private static Logger logger = Logger.getLogger(Demo1Server.class);
4     //端口号,要求客户端与服务器端一致
5     private static int PORT = 4444;
6    
7     public static void main(String[] args){
8         IoAcceptor acceptor = null;
9         try{
10             //创建一个非阻塞的server端的Socket
11             acceptor = new NioSocketAcceptor();
12             //设置过滤器(使用mina提供的文本换行符编解码器)
13             acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),LineDelimiter.WINDOWS.getValue(),LineDelimiter.WINDOWS.getValue())));
14             //自定义的编解码器
15             //acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new CharsetCodecFactory()));
16             //设置读取数据的换从区大小
17             acceptor.getSessionConfig().setReadBufferSize(2048);
18             //读写通道10秒内无操作进入空闲状态
19             acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
20             //为接收器设置管理服务
21             acceptor.setHandler(new Demo1ServerHandler());
22             //绑定端口
23             acceptor.bind(new InetSocketAddress(PORT));
24            
25             logger.info("服务器启动成功...    端口号未:"+PORT);
26            
27         }catch(Exception e){
28             logger.error("服务器启动异常...",e);
29             e.printStackTrace();
30         }
31     }
32
33 }

一个很简单的程序入口吧,简单的说就是在服务器上设置一个消息接收器,让它监听从端口传过来的消息并进行处理。那么接下来我们看看怎么进行消息处理。

新建一个消息处理类,或者说是是业务逻辑处理器——Demo1ServerHandler,它继承了IoHandlerAdapter类,它默认覆盖了七个方法,而我们主要使用messageReceived()。

public class Demo1ServerHandler extends IoHandlerAdapter {
   public static Logger logger = Logger.getLogger(Demo1ServerHandler.class);
   
   //从端口接受消息,会响应此方法来对消息进行处理
   @Override
   public void messageReceived(IoSession session, Object message)
           throws Exception {
               String msg = message.toString();
               if("exit".equals(msg)){
                    //如果客户端发来exit,则关闭该连接
                    session.close(true);
                }
       //向客户端发送消息
       Date date = new Date();
       session.write(date);
       logger.info("服务器接受消息成功...");        
       super.messageReceived(session, message);
   }

   //向客服端发送消息后会调用此方法
   @Override
   public void messageSent(IoSession session, Object message) throws Exception {
       logger.info("服务器发送消息成功...");
       super.messageSent(session, message);
   }

   //关闭与客户端的连接时会调用此方法
   @Override
   public void sessionClosed(IoSession session) throws Exception {
       logger.info("服务器与客户端断开连接...");
       super.sessionClosed(session);
   }

   //服务器与客户端创建连接
   @Override
   public void sessionCreated(IoSession session) throws Exception {
       logger.info("服务器与客户端创建连接...");
       super.sessionCreated(session);
   }

   //服务器与客户端连接打开
   @Override
   public void sessionOpened(IoSession session) throws Exception {
       logger.info("服务器与客户端连接打开...");
       super.sessionOpened(session);
   }

   @Override
   public void sessionIdle(IoSession session, IdleStatus status)
           throws Exception {
       logger.info("服务器进入空闲状态...");
       super.sessionIdle(session, status);
   }

   @Override
   public void exceptionCaught(IoSession session, Throwable cause)
           throws Exception {
       logger.info("服务器发送异常...");
       super.exceptionCaught(session, cause);
   }        
}

很直白的一段程序,相当于将服务器分成了七个状态,而每个状态都有自己的一套逻辑处理方案。

至此,一个最简单的Mina服务器框架就搭好了,我们可以使用电脑上的telnet命令来测试一下服务器能否使用
cmd控制台—>telnet <ip地址> <端口号>  如我的服务器ip地为192.168.1.10  那我就写telnet 192.168.1.10 4444 .此时我们可以看到输出日志为

此时连接已经创建,我们在输入信息服务器就会对信息进行处理,并给出相应的应答。
(telnet的用法不知道的可以自行百度)

 三、Mina客户端(Android端)

服务器简单搭建完毕,那么开始在Android端是配置服务器吧。同样的不要忘记加载jar包, 由于Android自带了Logout,所以就不使用Mina的日志包了。
由于接受消息会阻塞Android的进程,所以我把它开在子线程中(同时将其放在Service中,让其在后台运行)

1 public class MinaThread extends Thread {
2    
3     private IoSession session = null;
4
5     @Override
6     public void run() {
7         // TODO Auto-generated method stub
8         Log.d("TEST","客户端链接开始...");
9         IoConnector connector = new NioSocketConnector();
10         //设置链接超时时间
11         connector.setConnectTimeoutMillis(30000);
12         //添加过滤器
13         //connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new CharsetCodecFactory()));
14         connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),LineDelimiter.WINDOWS.getValue(),LineDelimiter.WINDOWS.getValue())));
15         connector.setHandler(new MinaClientHandler(minaService));
16        
17         try{
18             ConnectFuture future = connector.connect(new InetSocketAddress(ConstantUtil.WEB_MATCH_PATH,ConstantUtil.WEB_MATCH_PORT));//创建链接
19             future.awaitUninterruptibly();// 等待连接创建完成
20             session = future.getSession();//获得session
21             session.write("start");
22         }catch (Exception e){
23             Log.d("TEST","客户端链接异常...");
24         }
25         session.getCloseFuture().awaitUninterruptibly();//等待连接断开
26         Log.d("TEST","客户端断开...");
27         connector.dispose();
28         super.run();
29     }
30
31 }

不知道你们注意到了没,客户端的代码与服务器端的极其相似,不同的是服务器是创建NioSocketAcceptor对象,而客户端是创建NioSocketConnect对象。当然同样需要添加编码解码过滤器和业务逻辑过滤器。

业务逻辑过滤器代码:

1 public class MinaClientHandler extends IoHandlerAdapter{
2
3
4     @Override
5     public void exceptionCaught(IoSession session, Throwable cause)
6             throws Exception {
7         Log.d("TEST","客户端发生异常");
8         super.exceptionCaught(session, cause);
9     }
10
11     @Override
12     public void messageReceived(IoSession session, Object message)
13             throws Exception {
14         String msg = message.toString();
15         Log.d("TEST","客户端接收到的信息为:" + msg);
16         super.messageReceived(session, message);
17     }
18
19     @Override
20     public void messageSent(IoSession session, Object message) throws Exception {
21         // TODO Auto-generated method stub
22         super.messageSent(session, message);
23     }
24 }

方法功能与服务器端一样。测试这里就不做了。可以的话自己写个Demo效果更好

四、Mina的更多功能

拿到所有客户端Session

Collection<IoSession> sessions = session.getService().getManagedSessions().values();

自定义编码解码器,可以对消息进行预处理。要继承ProtocolEncoder和ProtocolDecode类。

数据对象的传递

这些功能不便放在这里讲了,可能我会以后再找机会另开一篇来讲述这些功能~,大家可以浏览结尾处的参考文章来加深对mina的理解。

 

在我认为,熟悉和快速使用一个新的的框架可以看出一个程序员的水平,同样及时总结和归纳自己学到的新知识也是一个好的程序员该具有的习惯。那么Mina的简单搭建就到这里为止了,希望对大家有所帮助

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 黑客攻击报案有用吗 java套接字测试程序出现空指针错误:java.lang.Nul... 有没有好的python socket框架推荐 c#下面有什么好的Socket 框架 socket 模式是一个怎样的意思,它有包括很多模式吗... socket/tcpip框架 怎么理解 SOCKET客户端框架有哪些? php socket 框架有哪些 java socket编程 服务器和客户端程序都连接不上,急... 4.socket框架netty的使用,以及nio的实现原理,为... socket高并发网络编程服务端有什么框架? android做IM 有没有合适的socket框架 C++函数GetDIBits怎么用??????? 关于电脑方面的一些专有英语词汇都有哪些? 求助流式staining buffer 的配方 javamail接收邮件怎么解析内容 请给出电路、电子系统中,缓冲器的比较权威点的定... 如何用python读取文件数据,并插入到influxdb数据库 如何从持久化存储中读取数据 翻译英文科室牌 python 读取本地数据然后插入到另一个数据库中 C/C++ 有哪些适合快速开发的socket服务器框架 一个JFrame和Socket的问题: 有没有哪些高效的c++ socket框架 ios用什么框架做socket开发 python有类似node下面socket.io的socket框架么 北蜂窝路15号怎么样?好不好?值不值得买? 北京北站离海淀区北蜂窝路甲15号远吗。 广安门 交通银行在哪? 从北京机场到海淀区北蜂窝路甲15号怎么走? 北京阳光汇点数码科技有限公司怎么样? 北京三里屯到海淀区北蜂窝路怎么走? 北京公积金管理中心 你了解自己的公积金余额吗? 北蜂窝2号对应的小学 北蜂窝东到水衙沟南开车怎么走 北京市海淀区派出所 离婚案件是否可以公开审理? 北京西站的历史 离婚案公告是什么意思 前门附近是否有中国建行? 离婚案件可以公开审理吗?