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

android上的socket通信的开源框架有哪些,第1张

请去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的简单搭建就到这里为止了,希望对大家有所帮助

这个多了去了 ,apache 绝对是 开源里面的领头羊

for example:

分类 项目名 说明 开发语言

服务器

(共20) Apache HTTP Server 全球第一HTTP服务器 C/C++

Tomcat Java的Web服务器 Java

James 邮件服务器 Java

SpamAssassin 反垃圾邮件 C/C++

Perl Apache的Perl编程语言支持 C/C++

Tcl TCL脚本语言 C/C++

Directory Server 超级目录服务器 Java

Axis WebServic服务器 Java

Kandula Axis中WS-Coordination、WS-AtomicTransaction、WS-BusinessActivity协议的实现 Java

Muse Axis中WS-ResourceFramework (WSRF), WS-BaseNotification (WSN), and WS-DistributedManagement (WSDM) 标准的实现(该项目Logo是个不认识的古汉字) Java

Pubscribe Web Services Notification (WSN) 标准实现 Java

Sandesha WS-ReliableMessaging 标准实现 Java

WSS4J WS-Security 标准实现 Java

WSRF Web Services Resource Framework 标准实现 Java

Addressing WebService的WS-Addressing标准(IBM、微软、BEA发布)实现 Java

XML Security XML签名与加密标准的Java、C++实现 Java/C++

jUDDI UDDI的Java实现 Java

XML-RPC XML-RPC实现 Java

Derby 纯Java做的关系数据库 Java

Xindice XML数据库 Java

开发工具(共5) Ant 自动编译 Java

Maven 项目管理工具,比Ant强大,支持插件开发 Java

Gump 每日集成工具,支持Ant、Maven Python

JMeter Web应用性能测试 Java

DdlUtils 用XML来定义DDL Java

Web开发框架(共19) Struts MVC的Web开发框架 Java

Cocoon Web开发框架,基于可运行的XML管道语言 Java

FOP XSL-FO 打印与输出解决方案,基于Java Java

AxKit 基于XML的Web发布 Java

Tapestry Web开发框架 Java

Turbine Web开发框架 Java

Shale 基于JSF的Web开发框架 Java

MyFaces 第一个开源的JSF实现 Java

Beehive 基于Structs的J2EE框架,简化J2EE编程;含Web界面、WebService开发框架 Java

Velocity 模板引擎 Java

Portals 门户解决方案 Java

Cactus Web开发测试框架 Java

Forrest 基于Cocoon的Web发布解决方案 Java

Slide 内容管理,支持WebDAV Java

Jackrabbit 内容库,用于内容管理 Java

Lenya 内容管理,支持版本管理、工作流、所见所得编辑器 Java

Xang 基于JavaScript进行动态Web开发 Java

Xindice 纯XML数据库 Java

JCS 分布式Cache系统(Java Caching System) Java

容器(共7) Geronimo J2EE容器,类似JBoss Java

iBATIS 简单OR映射,有.NET版本 Java/C#

Torque OR映射 Java

ORB ObjectRelationalBridge,OR映射 Java

JDO JDO标准的一个实现 Java

HiveMind 类似Spring的东西,微内核DI容器 Java

Excalibur IoC容器 Java

组件(共82) APR 不同操作系统间可移植运行时库 C/C++

Regexp Java正则表达式 Java

ORO Perl风格的正则表达式 Java

Xerces XML解析,Java/C两种版本 Java/C++

Crimson XML解析器 Java

AXIOM 更高效的DOM实现 Java

Lucene 全文检索,有.NET版本 Java/C#

Logging 不仅Log4j,各个语言的版本都有了 Java/C++/Perl/C#

XMLBeans XML转对象 Java

JaxMe Java/XML绑定的实现 Java

Taglibs JSP Tag库 Java

HttpComponents HTTP访问控件 Java

ECS 辅助生成标签(Element Construction Set) Java

WSIF WebService调用(Web Services Invocation Framework) Java

SOAP SOAP标准实现 Java

Woden WSDL书写工具 Java

Tuscany 简化SOA开发 Java

MIRAE 让手机支持基于XML的服务 Java

BSF 脚本语言框架(Bean Scripting Framework),支持JavaScript等多种脚本语言 Java

BCEL 用于直接生成字节码(Byte Code Engineering Library) Java

POI 存取Office文档 Java

Batik JAVA的SVG实现 Java

Attributes 访问Java 1.5语言中定义的meta 这些项目都在jakarta commons中,都是Java的

BeanUtils 反射支持

Betwixt XML/JavaBean转换

Chain 职责链模式实现

CLI 命令行参数解析

Codec 通用加密/加密算法

Collections Java容器类完善扩充

Configuration 各种来源配置文件存取

Daemon Java模拟Unix的Daemon

DBCP 数据链连接池

DbUtils JDBC辅助类

Digester XML到Java对象映射工具

Discovery 根据名称来查找资源

EL JSP 2.0 表达式标准实现

Email 发送Email类

FileUpload 文件上传辅助类

HttpClient HTTP客户端

IO IO操作辅助类

Jelly 基于XML的脚本引擎

Jexl JSTL 表达式语言扩展

JXPath 用XPath语言来操作对象的辅助类

Lang java.lang.类扩充

Launcher 跨平台Java应用启动器

Logging 不同Log实现的封装

Math 数学、统计辅助类

Modeler 创建兼容JMX标准的MBeans

Net 各种网络协议实现

Pool 对象池

Primitives 很小的Java原始对象类型操作辅助类

SCXML 状态图XML标准实现

Transaction 多层次容器、文件操作事务支持

Validator 用XML定义校验器和校验规则

VFS 虚拟文件系统用于操作FTP、SMB、Zip等

Compress tar、zip、bzip2压缩格式文件操作 这些项目都在jakarta commons中的Sandbox中

CSV CSV文件格式支持

Exec 外部进程执行和环境设置辅助类

Finder 模拟Unix find命令

I18n 国际化辅助类

Id 生成ID辅助类

Javaflow 应用状态管理

JCI Java编译器接口

OpenPGP OpenPGP封装

Pipeline 管道辅助类用于并行或者顺序操作数据

Proxy 动态代码生成辅助类

Cache 对象缓存服务 这些项目都在jakarta commons中的Dormant(睡眠)中

Clazz class操作和反射操作

Contract 契约编程用到Java中

Convert Java对象类西转换辅助类

Events 事件管理容器

Feedparser RSS和Atom实现

Functor 用对象方式来操作函数

JJar Jar操作

Latka HTTP功能测试

Mapper 简单封装后可以选择不同的对象映射实现

Messenger JMS用于Web开发中的辅助类

Resources 国际化资源信息查找

Scaffold Web应用开发工具

ThreadPool 线程池

Workflow 工作流管理系统框架

XMLIO XML配置快速简便导入


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/206573.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-03
下一篇2023-04-03

发表评论

登录后才能评论

评论列表(0条)

    保存