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代码   收藏代码
  1. package com.ray.test;  
  2.   
  3. import java.util.Date;  
  4. import javax.jdo.annotations.IdGeneratorStrategy;  
  5. import javax.jdo.annotations.IdentityType;  
  6. import javax.jdo.annotations.PersistenceCapable;  
  7. import javax.jdo.annotations.Persistent;  
  8. import javax.jdo.annotations.PrimaryKey;  
  9.   
  10. //标记对象可以持久化  
  11. @PersistenceCapable(identityType = IdentityType.APPLICATION)  
  12. public class Employee {  
  13.   
  14.     //标记主键,作以后查询之用  
  15.     @PrimaryKey  
  16.     @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  
  17.     private String firstName;  
  18.       
  19.     @Persistent  
  20.     private String lastName;  
  21.       
  22.     @Persistent  
  23.     private Date birthDate;  
  24.       
  25.     public Employee(String firstName, String lastName, Date birthDate) {  
  26.         this.firstName = firstName;  
  27.         this.lastName = lastName;  
  28.         this.birthDate = birthDate;  
  29.     }  
  30.   
  31.     public String getFirstName() {  
  32.         return firstName;  
  33.     }     
  34. }  

 

 步骤2.存取Bean(可以写在Servlet的doGet()或者doPost()里面):

 

Java代码   收藏代码
  1. package com.ray.test;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Date;  
  5. import javax.jdo.PersistenceManager;  
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. @SuppressWarnings("serial")  
  12. public class HelloServlet extends HttpServlet {  
  13.     public void doGet(HttpServletRequest req,   
  14.             HttpServletResponse resp)throws IOException {  
  15.           
  16.         resp.setContentType("text/plain");  
  17.           
  18.         Employee e = new Employee("Alfred""Smith"new Date());  
  19.         //获取用以存取对象的PersistenceManager  
  20.         PersistenceManager pm = PMF.get().getPersistenceManager();  
  21.       
  22.         try {  
  23.             //存储对象  
  24.             resp.getWriter().println("saving object!");  
  25.             pm.makePersistent(e);       
  26.         }catch(Exception ex){  
  27.             resp.getWriter().println("cannot persistent!");  
  28.             ex.printStackTrace();     
  29.         }   
  30.         finally {  
  31.             pm.close();  
  32.         }  
  33.           
  34.         try{  
  35.             //再次获取用以存取对象的PersistenceManager  
  36.             pm = PMF.get().getPersistenceManager();  
  37.             //由主键检索对象,Alfred之前被定义为主键的  
  38.             Employee newE = pm.getObjectById(Employee.class"Alfred");  
  39.             //读取新对象的信息检测对象检索是否成功  
  40.             resp.getWriter().println("Employee:"+newE.getFirstName());  
  41.         }catch(Exception ex){  
  42.             ex.printStackTrace();  
  43.             resp.getWriter().println("cannot get data!");  
  44.             pm.close();  
  45.         }  
  46.     }  
  47.   
  48.     @Override  
  49.     protected void doPost(HttpServletRequest req,   
  50.             HttpServletResponse resp)throws ServletException, IOException {  
  51.         this.doGet(req, resp);  
  52.     }  
  53. }  

 

 其中PMF类的代码如下,没看错应该是个单例模式:

 

Java代码   收藏代码
  1. package com.ray.test;  
  2.   
  3. import javax.jdo.JDOHelper;  
  4. import javax.jdo.PersistenceManagerFactory;  
  5.   
  6. public final class PMF {  
  7.     private static final PersistenceManagerFactory pmfInstance =  
  8.         JDOHelper.getPersistenceManagerFactory("transactions-optional");  
  9.   
  10.     private PMF() {}  
  11.   
  12.     public static PersistenceManagerFactory get() {  
  13.         return pmfInstance;  
  14.     }  
  15. }  

 

 Demo2.使用Google 账户认证服务:

 

Java代码   收藏代码
  1. package com.ray.test;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. import com.google.appengine.api.users.UserService;  
  11. import com.google.appengine.api.users.UserServiceFactory;  
  12.   
  13. public class GoogleAccount extends HttpServlet{  
  14.   
  15.     @Override  
  16.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  17.             throws ServletException, IOException {  
  18.         //创建用户服务  
  19.         UserService userService = UserServiceFactory.getUserService();  
  20.           
  21.         String thisURL = req.getRequestURI();  
  22.         //通过请求对象的 getUserPrincipal() 方法测试用户是否使用 Google 帐户登录  
  23.         if (req.getUserPrincipal() != null) {  
  24.             //如果有登录,则创建Login地址  
  25.             resp.getWriter().println("<p>Hello, " +  
  26.                                          req.getUserPrincipal().getName() +  
  27.                                          "!  You can <a href=\"" +  
  28.                                          userService.createLogoutURL(thisURL) +  
  29.                                          "\">sign out</a>.</p>");  
  30.         } else {  
  31.             //如果没有登录,则创建Login地址  
  32.             resp.getWriter().println("<p>Please <a href=\"" +  
  33.                                          userService.createLoginURL(thisURL) +  
  34.                                          "\">sign in</a>.</p>");  
  35.         }  
  36.     }  
  37.   
  38.     @Override  
  39.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  40.             throws ServletException, IOException {  
  41.         doGet(req, resp);  
  42.     }     
  43. }  

 

 手机访问登录效果:

 

需要特别指出的是,Google通过在web.xml里面配置权限来区分登录者的权限,可以用下面的代码来配置安全常量从而划定只能由admin访问的区域---admin路径下的所有页面:

 

Xml代码   收藏代码
  1. <security-constraint>  
  2.        <web-resource-collection>  
  3.            <url-pattern>/admin/*</url-pattern>  
  4.        </web-resource-collection>  
  5.        <auth-constraint>  
  6.            <role-name>admin</role-name>  
  7.        </auth-constraint>  
  8.    </security-constraint>  

 参考资料:

http://code.google.com/intl/zh-CN/appengine/docs/java/overview.html



你可能感兴趣的:(java,游戏,android,服务器,Google,UCWeb)