Android(安卓)游戏开发之服务器端
首先我不知道这篇文章发到Android开发板块是否适合的,因为只部分内容大多数是有关Google appEngine的,但因为这是AppEngine和Android的配合开发,故对Android开发者也有一定的参考意义,故发到这里来了。
其次,在写文章前先谢谢UCWeb Android的产品经理huang,谢谢他的赏识,虽然最后因为一些个人原因我没留在UC,但从笔试和面试的过程中,我发觉UC真是一家严谨、惜才的公司,搞Android的朋友如果有兴趣,可以考虑应聘一下UC的社招。
OK,进入正题!
在做游戏开发的时候,很多游戏都会提供一个全球分数排名的的功能,这就需要使用服务器了,当然,你可以选择搭建自己的服务器,但从成本,稳定性和开发周期上看,我认为Google AppEngine是个很不错的选择,现在Google AppEngine关于Python的参考资料比较详尽,Java的就比较少,所以我把我写的小Demo放上来,做抛砖引玉之用,因为我也是初学者,所以demo一切从简,大侠请不要见笑哦!
Demo1:对象的存储:
步骤1.定义JavaBean:
Java代码- packagecom.ray.test;
- importjava.util.Date;
- importjavax.jdo.annotations.IdGeneratorStrategy;
- importjavax.jdo.annotations.IdentityType;
- importjavax.jdo.annotations.PersistenceCapable;
- importjavax.jdo.annotations.Persistent;
- importjavax.jdo.annotations.PrimaryKey;
- //标记对象可以持久化
- @PersistenceCapable(identityType=IdentityType.APPLICATION)
- publicclassEmployee{
- //标记主键,作以后查询之用
- @PrimaryKey
- @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
- privateStringfirstName;
- @Persistent
- privateStringlastName;
- @Persistent
- privateDatebirthDate;
- publicEmployee(StringfirstName,StringlastName,DatebirthDate){
- this.firstName=firstName;
- this.lastName=lastName;
- this.birthDate=birthDate;
- }
- publicStringgetFirstName(){
- returnfirstName;
- }
- }
步骤2.存取Bean(可以写在Servlet的doGet()或者doPost()里面):
Java代码- packagecom.ray.test;
- importjava.io.IOException;
- importjava.util.Date;
- importjavax.jdo.PersistenceManager;
- importjavax.servlet.ServletException;
- importjavax.servlet.http.HttpServlet;
- importjavax.servlet.http.HttpServletRequest;
- importjavax.servlet.http.HttpServletResponse;
- @SuppressWarnings("serial")
- publicclassHelloServletextendsHttpServlet{
- publicvoiddoGet(HttpServletRequestreq,
- HttpServletResponseresp)throwsIOException{
- resp.setContentType("text/plain");
- Employeee=newEmployee("Alfred","Smith",newDate());
- //获取用以存取对象的PersistenceManager
- PersistenceManagerpm=PMF.get().getPersistenceManager();
- try{
- //存储对象
- resp.getWriter().println("savingobject!");
- pm.makePersistent(e);
- }catch(Exceptionex){
- resp.getWriter().println("cannotpersistent!");
- ex.printStackTrace();
- }
- finally{
- pm.close();
- }
- try{
- //再次获取用以存取对象的PersistenceManager
- pm=PMF.get().getPersistenceManager();
- //由主键检索对象,Alfred之前被定义为主键的
- EmployeenewE=pm.getObjectById(Employee.class,"Alfred");
- //读取新对象的信息检测对象检索是否成功
- resp.getWriter().println("Employee:"+newE.getFirstName());
- }catch(Exceptionex){
- ex.printStackTrace();
- resp.getWriter().println("cannotgetdata!");
- pm.close();
- }
- }
- @Override
- protectedvoiddoPost(HttpServletRequestreq,
- HttpServletResponseresp)throwsServletException,IOException{
- this.doGet(req,resp);
- }
- }
其中PMF类的代码如下,没看错应该是个单例模式:
Java代码- packagecom.ray.test;
- importjavax.jdo.JDOHelper;
- importjavax.jdo.PersistenceManagerFactory;
- publicfinalclassPMF{
- privatestaticfinalPersistenceManagerFactorypmfInstance=
- JDOHelper.getPersistenceManagerFactory("transactions-optional");
- privatePMF(){}
- publicstaticPersistenceManagerFactoryget(){
- returnpmfInstance;
- }
- }
Demo2.使用Google 账户认证服务:
Java代码- packagecom.ray.test;
- importjava.io.IOException;
- importjavax.servlet.ServletException;
- importjavax.servlet.http.HttpServlet;
- importjavax.servlet.http.HttpServletRequest;
- importjavax.servlet.http.HttpServletResponse;
- importcom.google.appengine.api.users.UserService;
- importcom.google.appengine.api.users.UserServiceFactory;
- publicclassGoogleAccountextendsHttpServlet{
- @Override
- protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
- throwsServletException,IOException{
- //创建用户服务
- UserServiceuserService=UserServiceFactory.getUserService();
- StringthisURL=req.getRequestURI();
- //通过请求对象的getUserPrincipal()方法测试用户是否使用Google帐户登录
- if(req.getUserPrincipal()!=null){
- //如果有登录,则创建Login地址
- resp.getWriter().println("<p>Hello,"+
- req.getUserPrincipal().getName()+
- "!Youcan<ahref=\""+
- userService.createLogoutURL(thisURL)+
- "\">signout</a>.</p>");
- }else{
- //如果没有登录,则创建Login地址
- resp.getWriter().println("<p>Please<ahref=\""+
- userService.createLoginURL(thisURL)+
- "\">signin</a>.</p>");
- }
- }
- @Override
- protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)
- throwsServletException,IOException{
- doGet(req,resp);
- }
- }
手机访问登录效果:
需要特别指出的是,Google通过在web.xml里面配置权限来区分登录者的权限,可以用下面的代码来配置安全常量从而划定只能由admin访问的区域---admin路径下的所有页面:
Xml代码- <security-constraint>
- <web-resource-collection>
- <url-pattern>/admin/*</url-pattern>
- </web-resource-collection>
- <auth-constraint>
- <role-name>admin</role-name>
- </auth-constraint>
- </security-constraint>
参考资料:
http://code.google.com/intl/zh-CN/appengine/docs/java/overview.html
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- libevent 多线程IO
- Android流媒体开发之路三:基于NDK开发Android平台RTSP播放器
- 应该是史上最全最新Java和Android面试题目(自己总结和收集的)
- 代码实例 -- 在程序里检查虚拟键盘状态, 并开启关闭
- “Android第一书”作者郭霖:用心做事,结果自然水到渠成
- 迷途d书童 Android(安卓)如何从系统图库中选择图片
- 接口的使用,以及在异步任务中的使用
- Android(安卓)吸入动画效果实现分解