导航:首页 > 操作系统 > hibernateandroid

hibernateandroid

发布时间:2023-01-15 00:59:35

A. 怎样搭建一个android开发框架

相对于传统计算机程序语言来说,Android开发学习资源上还稍微欠缺一些,对于一些基础应用讲解还稍显匮乏,本篇所讲述的Android培训内容可以帮助大家更好的理解Android项目快速开发框架。结合之前所用的ormlite和hessian,再加上SAE已经支持java,把服务端切换到JAVA,也就有了本文。使用hessian来做数据传输,ormlite来实现客户端与服务端的数据存储,极大的减少了CRUD工作。本文为探索贴,未正式用于大型项目,欢迎大家讨论使用!正文一、简介1.1 ormliteOrmlite[Object Relational Mapping Lite (ORM Lite)]对象关系映射精简版(精简版的ORM)提供了一些简单的,轻量级持久化Java对象到SQL数据库,同时也避免了复杂性和更多的标准的ORM包的开销的功能。支持数据库的jdbc调用,当然,最重要的肯定是它支持android原生的数据库api调用sqlite。——转载自这里。1.2 hessian使用方法参照本博两篇文章:[hessdroid]Android下使用Hessian与Java服务端通讯[hessdroid]Android下使用Hessian与Java服务端通讯的传值测试1.3 Android快速开发框架说明考虑如下几个特点:a). 客户端(Android)和服务端均使用Java语言b). 客户端(Android)和服务端均支持Hessian和ormlite框架c). 完整的支持面向对象开发:存储和交互传输二、准备2.1 开发环境为了便于同时开发Android和Java Web,这里下载的是Eclipse IDE for Java EE Developers版本,然后安装最新的ADT插件和TOMCAT插件。2.2 服务端应用服务器使用Tomcat,采用Java(JSP/Servlet)来实现服务端的业务逻辑,数据库使用Mysql。快速框架搭建推荐大家使用XAMPP(集成Apache、MySQL、PHP等,支持绿色安装)。2.3 客户端普通的Android环境2.4 通信与存储说明服务端与客户端通过Hessian进行数据交换,通过Ormlite保存数据库(通过JDBC保存到服务端的MYSQL数据库,也可以直接保存到客户端的sqlite数据库);三、代码3.1 项目工程截图(服务端)HOLib共用于客户端和服务端,保证接口和数据对象一致性。3.2 重点代码分析3.2.1 服务端web.xml<?xml version="1.0" encoding="ISO-8859-1"?><web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>user</servlet-name> <servlet-class>com.nmbb.ho.server.servlet.UserServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>user</servlet-name> <url-pattern>/user.do</url-pattern> </servlet-mapping> <listener> <listener-class>com.nmbb.ho.server.StartupInit</listener-class> </listener></web-app>StartupInit.javapublic class StartupInit implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent arg0) { try { TableUtils.dropTable(OrmliteHelper.getConnection(), POUser.class, true); //创建数据库 TableUtils.createTable(OrmliteHelper.getConnection(), POUser.class); } catch (SQLException e) { e.printStackTrace(); } } @Override public void contextDestroyed(ServletContextEvent arg0) { }} 代码说明:StartupInit可用于创建数据库表结构,这里用于测试,真实环境注意数据丢失问题。POUser.java@DatabaseTable(tableName = "nmbb_users")public class POUser implements Serializable { /** 用户编号,6位数字 */ @DatabaseField(generatedId = true) public int suid; /** 用户名 */ @DatabaseField(width = 30) public String username; /** 密码 */ @DatabaseField(width = 30) public String password; /** 昵称 */ @DatabaseField(width = 60) public String nickname; /** 200 正常 201 数据校验错误 202用户已经存在 */ public int status = 200; /** 用于放错误信息 */ public String msg; public POUser() { }} 代码说明:注意需要一个空的构造函数,其他请参考ormlite资料。UserServlet.java/*** 用户Servlet** @author 农民伯伯* @see http://www.cnblogs.com/over140/archive/2013/02/19/2917231.html**/public class UserServlet extends HessianServlet implements IUserService { @Override public POUser register(String username, String password) { POUser result = new POUser(); System.out.println("[UserServlet.register]..."); // 检测数据是否合法 if (isEmpty(username) || isEmpty(password)) { result.status = 201; result.msg = "用户名或密码不能为空"; } else { // 检测用户是否存在 OrmliteHelper<POUser> db = new OrmliteHelper<POUser>(); if (db.exist(POUser.class, "username", username)) { result.status = 202; result.msg = "用户名已经存在"; } else { result.username = username; result.password = password; db.create(result);// 入库 result.msg = "注册成功"; System.out.println("create user suid:" + result.suid); } } return result; } @Override public List<POUser> query(int suid, int startIndex, int pageSize) { return new OrmliteHelper<POUser>().query(POUser.class, "suid", suid, startIndex, pageSize) ; } /** * 判断字符串是否为空 * * @param str * @return */ public static boolean isEmpty(String str) { return str == null || str.length() == 0; }}3.2.2 客户端(Android) public class UserActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void OnClickRegiger(View view) { new AsyncTask<Void, Void, POUser>() { @Override protected POUser doInBackground(Void... params) { String url = "http://192.168.68.23:8081/HOServer/user.do"; HessianProxyFactory factory = new HessianProxyFactory(); try { factory.setDebug(true); factory.setReadTimeout(5000); //不设置会报 expected hessian reply at 0x48 factory.setHessian2Reply(false); IUserService basic = (IUserService) factory.create(IUserService.class, url, getClassLoader()); return basic.register("admin", "123456"); } catch (MalformedURLException e) { Log.e("UserActivity", "OnClickRegiger", e); } catch (Exception e) { Log.e("UserActivity", "OnClickRegiger", e); } return null; } @Override protected void onPostExecute(POUser result) { if (result != null) { if (result.status == 200) { //保存入库 new DbHelper<POUser>().create(result); } Toast.makeText(UserActivity.this, "" + result.msg, Toast.LENGTH_LONG).show(); } }; }.execute(); }}代码说明:1、DbHelper在源码里给出。2、如果项目无法编译通过,请注意设置项目的字符编码、JDK版本、Android的版本。三、总结5.1 优点a). 完全面向对象开发b). 降低项目的复杂度,减少引入其他框架所带来的复杂性c). 非常适合一个开发服务端和客户端充分的利用的框架的特点,提交开发效率,适合中小型项目快速开发。5.2 缺点a). 注意服务端与客户端共用id的问题5.3 其他a). ormlite支持标准的JPA助记符,这里。这样服务端采用Hibernate应该也是可以的,有时间可以做一个整合例子看看。学习语言同做事情一样,想通其中的关系,就会事半功倍,对语言要深入的理解,

B. 开发Android APP使用的是什么语言

开发Android APP可以使用Java语言和C语言。

Java是一种编程语言,被特意设计用于互联网的分布式环境。Java具有类似于C++语言的“形式和感觉”,但它要比C++语言更易于使用,而且在编程时彻底采用了一种“以对象为导向”的方式。

使用Java编写的应用程序,既可以在一台单独的电脑上运行,也可以被分布在一个网络的服务器端和客户端运行。另外,Java还可以被用来编写容量很小的应用程序模块或者applet,做为网页的一部分使用。applet可使网页使用者和网页之间进行交互式操作。

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

(2)hibernateandroid扩展阅读:

Java平台由Java虚拟机(Java Virtual Machine)和Java 应用编程接口(Application Programming Interface、简称API)构成。Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。

在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。现在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。Java应用编程接口已经从1.1x版发展到1.2版。目前常用的Java平台基于Java1.5,最近版本为Java1.9。

C程序是由一组变量或是函数的外部对象组成的。 函数是一个自我包含的完成一定相关功能的执行代码段。我们可以把函数看成一个“黑盒子”,你只要将数据送进去就能得到结果,而函数内部究竟是如何工作的,外部程序是不知道的。

C程序中函数的数目实际上是不限的,如果说有什么限制的话,那就是,一个C程序中必须至少有一个函数,而且其中必须有一个并且仅有一个以main为名,这个函数称为主函数,整个程序从这个主函数开始执行。

C. 怎么使用androidpn实现android手机消息推送

由于目前的web项目中要用到android手机消息推送,尝试过很多中方式之后发现,利用androidpn的部分代码来实现这个功能是比较方便的。经过使用tsung进行简单的压力测试,证明这个框架能够满足大多数简单应用的需求。

Androidpn包含有server和client两个包,server部分可以作为服务器单独运行,也可以嵌入到web项目的servlet中,在tomcat环境中与web项目的其他部分交互。androidpn的简单用法网上已经有很多文章介绍,这里就不细说了。主要谈谈如何将androidpn和自己的web程序整合到一起。

Server部分的主要包结构如下:

其中org.androidpn.server.,org.androidpn.server.model和org.androidpn.server.service为使用hibernate链接数据库并实现简单的用户登录认证,开发中可以用我们自己的认证模块替换。剩下的包就是推送的主体实现。

接下来逐个包来看:

1.util包中的类用来加载resources中的配置文件,在配置文件中可指定监听端口和ssl证书目录等属性。

2.org.androidpn.server.xmpp包里面定义了一些异常类型,主要是包含有入口类XmppServer,这个类用来启动和停止server程序。

3.org.androidpn.server.xmpp.auth包里面是认证的一些类,我们自己的认证模块可以在这里与androidpn进行结合。

4.org.androidpn.server.xmpp.codec是XMPP协议的XML文件解析包,server收到和发送的消息都要通过这个包来进行xmpp协议编码和解码。

5.org.androidpn.server.xmpp.handler包主要是对消息的处理,我们可以针对不同的消息类型定义自己的handler,

6.org.androidpn.server.xmpp.net包负责维护与client之间的持久连接,并实现了一些传输方式供发送xmpp消息时使用。

7.org.androidpn.server.xmpp.presence里面只包含PresenceManager类,用来维护client的在线状态。

8.org.androidpn.server.xmpp.push包里面的NotificationManager类包含有向client发送消息的接口。

9.org.androidpn.server.xmpp.router包负责将收到的信息包发送到相应的handler进行处理,是一个路由包。

10.org.androidpn.server.xmpp.session包定义了用来表示持久链接的session,每个session包含一条连接的状态信息。

11.org.androidpn.server.xmpp.ssl是对连接进行ssl认证的工具包。

server发送消息的整个流程主要是:

1. NotificationManager的push接口被调用。

2.使用SessionManager在当前session集合中查找相应的client链接。

3.定义自己的XMPP消息格式并组装。

4.通过相应session,向client发送消息。

在这个流程中我们需要修改的是步骤3,也就是需要定义和组装自己的xmpp消息,以便于将适当的信息传到客户端并便于客户端解析。一个简单的消息组装例子如下:

private IQ createMessageIQ(String title, String message, String userId,
String json) {
Element notification = DocumentHelper.createElement(QName.get(
"message", INQURIE_NAMESPACE));
notification.addElement("title").setText(title);
notification.addElement("text").setText(message);
notification.addElement("userId").setText(userId);
notification.addElement("json").setText(json);
IQ iq = new IQ();
iq.setType(IQ.Type.set);
iq.setChildElement(notification);
return iq;
}
要注意的是在创建element的时候,传入的namespace要和client解析使用的namespace相匹配。

server端接收和处理消息的流程是:

1.connection收到packet,使用tsc.push.server.xmpp.codec解码。

2.router根据packet的namespace等信息,将packet路由到相应的handler。

3.handler进行处理。

相应的router和handler类在androidpn中都有例子可以参考,这里就不贴代码了。开发中只要根据client发送消息的格式,定义自己的router和handler类,然后在PacketRouter中注册router,在IQRouter中注册handler即可。

Client部分的主要包结构如下:

这边包含有消息的收发,解析以及持久连接的发起,重连等功能呢,十分强大,我们开发时完全不用管底层的连接,也不用担心断线,可以专注于业务部分的开发。

同时,代码结构也很简单。去除android的Service和BroadCast类以及一些工具类和常量类不谈:

1.NotificationIQ,NotificationIQProvider,NotificationPacketListener三个类负责对收到的Notification格式的消息进行解析和处理,

2.XmppManager是主控制器,NotificationService通过这个类,在后台维护androidpn连接。

3.PersistentConnectionListener,PhoneStateChangeListener,ReconnectionThread.java三个类则负责监听手机的状态并进行断线重连。

我们自定义消息时需要定义3个类:在***IQ中定义消息的实体,在***IQProvider中将消息转化为***IQ实体,在***PacketListener中对实体进行处理,具体的实现可参考NotificationIQ,NotificationIQProvider,NotificationPacketListener三个类。在定义这些类之后,还需要在XmppManager中将这3个类中注册到connection中,代码如下:

//ConnectTask
connection.connect();
Log.i(LOGTAG, "XMPP connected successfully");

// packet provider
ProviderManager.getInstance().addIQProvider("message",
Constants.NOTIFICATION_NAMESPACE,
new NotificationIQProvider());
//LoginTask
// packet filter
PacketFilter packetFilter = new PacketTypeFilter(
NotificationIQ.class);
// packet listener
PacketListener packetListener = xmppManager
.getNotificationPacketListener();
connection.addPacketListener(packetListener, packetFilter);
需要注意的是,注册***IQProvider时,传入的namespace需要和服务端组装消息时使用的namespace一致,才能正确的收到。

D. 学习android, 需不需要学习struts, hibernate,spring

不需要,如果你只想在Android应用方面发展,学完J2SE基础 就可以学Android了… 最好是讲java GUI部分 (awt,swing)熟悉下先,然后类比学习Android就会很轻松了。另外,如果有时间研究下SSH框架对Android框架理解会更有帮助。希望我的回答对你有所帮助!

E. Hibernate+Gson封装数据时报错;大神救急,小弟第一次做Android项目,不能退。

我这是用JSON封装的
个人觉得这个也还蛮方便的,支持LIST MAP对象直转

Map<String, Object> map=erpCljhManager.findFenYeDataForHql(hql, start, limit);

JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
jsonConfig.setExcludes(new String[] { "handler",
"hibernateLazyInitializer" });
jsonConfig.registerJsonValueProcessor(java.util.Date.class,
new JsonDateValueProcessor("yyyy-MM-dd"));
JSONObject jsonObject = JSONObject.fromObject(map, jsonConfig);
out.println(dealString4JSON(jsonObject.toString()));
out.flush();
out.close();

F. Android中可以使用hibernate进行数据存储操作吗

不可以 对于android来说它除了使用了一些java的基础的类库外,它有自己的API,对于javaee的那些框架对于android不能用的。
Android的五大存储操作
1. SharedPreferences
2. 文件存储
3. SQLite存储
4. ContentProvider
5. 网络存储

更详细的在网上搜

G. Android中 Spring、MVC、hibernate这些框架对于安卓开发有什么用

Spring作用:

Spring提供许多功能,在此我将快速地依次展示其各个主要方面。

首先,让我们明确Spring范围。尽管Spring覆盖了许多方面,但我们已经有清楚的概念,它什么应该涉及和什么不应该涉及。

Spring的主要目的是使JavaEE易用和促进好编程习惯。

Spring不重新开发已有的东西。因此,在Spring中你将发现没有日志记录的包,没有连接池,没有分布事务调度。这些均有开源项目提供(例如Commons
Logging 用来做所有的日志输出,或Commons DBCP用来作数据连接池),或由你的应用程序服务器提供。因为同样的的原因,我们没有提供O/R
mapping层,对此,已有友好的解决办法如Hibernate和JDO。Spring的目标是使已存在的技术更加易用。

例如,尽管我们没有底层事务协调处理,但我们提供了一个抽象层覆盖了JTA或任何其他的事务策略。

Spring没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东西。例如,像许多开发人员,我们从来没有为Struts高兴过,并且感到在MVC
web
framework中还有改进的余地。在某些领域,例如轻量级的IoC容器和AOP框架,Spring有直接的竞争,但是在这些领域还没有已经较为流行的解决方案。(Spring在这些区域是开路先锋。)

Spring也得益于内在的一致性。

所有的开发者都在唱同样的的赞歌,基础想法依然是Expert One-on-One J2EE设计与开发的那些。

并且我们已经能够使用一些主要的概念,例如倒置控制,来处理多个领域。

Spring在应用服务器之间是可移植的。

当然保证可移植性总是一次挑战,但是我们避免任何特定平台或非标准化,并且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的应用服务器上的用户。

MVC介绍:

MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。

模型-视图-控制器(MVC)是Xerox
PARC在二十世纪八十年代为编程语言Smalltalk-80发明的一种软件设计模式,已被广泛使用。后来被推荐为Oracle旗下Sun公司Java
EE平台的设计模式,并且受到越来越多的使用ColdFusion和PHP的开发者的欢迎。模型-视图-控制器模式是一个有用的工具箱,它有很多好处,但也有一些缺点。

hibernate介绍:

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

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

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

阅读全文

与hibernateandroid相关的资料

热点内容
明日之后安卓太卡怎么办 浏览:502
如何使用命令方块找到村庄 浏览:766
泛函压缩映像原理 浏览:521
win10清除文件夹浏览记录 浏览:964
如何查看服务器域中所有服务 浏览:384
学mastercam91编程要多久 浏览:999
如何查服务器地址和端口 浏览:911
教学云平台app怎么下载 浏览:389
单片机510教学视频 浏览:624
陕西信合app怎么查看自己的存款 浏览:663
风冷冰箱有压缩机 浏览:274
android实现wifi连接wifi 浏览:669
飞猪app怎么帮别人值机 浏览:924
笔记本开我的世界服务器地址 浏览:546
怎样隐藏bat命令 浏览:127
android开发创意 浏览:138
京剧猫为什么进不去服务器 浏览:784
怎么自己免费制作一个手机app 浏览:582
python同时迭代两个变量 浏览:740
好分数app家长版怎么删除孩子 浏览:426