`

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:

 

package com.ray.test;

import java.util.Date;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

//标记对象可以持久化
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Employee {

	//标记主键,作以后查询之用
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	private String firstName;
	
	@Persistent
	private String lastName;
	
	@Persistent
	private Date birthDate;
	
	public Employee(String firstName, String lastName, Date birthDate) {
		this.firstName = firstName;
		this.lastName = lastName;
		this.birthDate = birthDate;
	}

	public String getFirstName() {
		return firstName;
	}   
}

 

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

 

package com.ray.test;

import java.io.IOException;
import java.util.Date;
import javax.jdo.PersistenceManager;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class HelloServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, 
			HttpServletResponse resp)throws IOException {
		
		resp.setContentType("text/plain");
		
		Employee e = new Employee("Alfred", "Smith", new Date());
		//获取用以存取对象的PersistenceManager
	    PersistenceManager pm = PMF.get().getPersistenceManager();
    
        try {
        	//存储对象
        	resp.getWriter().println("saving object!");
            pm.makePersistent(e);     
        }catch(Exception ex){
        	resp.getWriter().println("cannot persistent!");
        	ex.printStackTrace();	
        } 
        finally {
            pm.close();
        }
        
        try{
        	//再次获取用以存取对象的PersistenceManager
        	pm = PMF.get().getPersistenceManager();
        	//由主键检索对象,Alfred之前被定义为主键的
	        Employee newE = pm.getObjectById(Employee.class, "Alfred");
	        //读取新对象的信息检测对象检索是否成功
	        resp.getWriter().println("Employee:"+newE.getFirstName());
        }catch(Exception ex){
        	ex.printStackTrace();
        	resp.getWriter().println("cannot get data!");
        	pm.close();
        }
	}

	@Override
	protected void doPost(HttpServletRequest req, 
			HttpServletResponse resp)throws ServletException, IOException {
		this.doGet(req, resp);
	}
}

 

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

 

package com.ray.test;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;

public final class PMF {
    private static final PersistenceManagerFactory pmfInstance =
        JDOHelper.getPersistenceManagerFactory("transactions-optional");

    private PMF() {}

    public static PersistenceManagerFactory get() {
        return pmfInstance;
    }
}

 

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

 

package com.ray.test;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

public class GoogleAccount extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//创建用户服务
		UserService userService = UserServiceFactory.getUserService();
		
      	String thisURL = req.getRequestURI();
      	//通过请求对象的 getUserPrincipal() 方法测试用户是否使用 Google 帐户登录
        if (req.getUserPrincipal() != null) {
        	//如果有登录,则创建Login地址
        	resp.getWriter().println("<p>Hello, " +
                                         req.getUserPrincipal().getName() +
                                         "!  You can <a href=\"" +
                                         userService.createLogoutURL(thisURL) +
                                         "\">sign out</a>.</p>");
        } else {
        	//如果没有登录,则创建Login地址
        	resp.getWriter().println("<p>Please <a href=\"" +
                                         userService.createLoginURL(thisURL) +
                                         "\">sign in</a>.</p>");
        }
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req, resp);
	}	
}

 

 手机访问登录效果:

 

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

 

	<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

分享到:
评论
11 楼 wmcoo 2010-01-14  
void1898 写道
风中独火 写道
wmcoo 写道
Google App Engine的应用验证码怎么收不到
用的移动号码
+86135....
楼主是什么时候注册的


换个手机,或者是换别的运营商的手机,我刚刚用联通的手机是可以收到的.



貌似可以填一个报告单,跟Google说收不到,对方回处理的


终于等来了,以为被GOOGLE忘记了

Your Google App Engine Account has been enabled!

Hello,

You're receiving this email because you indicated you'd had some problems 
verifying your Google App Engine account using SMS.  We just wanted to let 
you know we've enabled your account--you should be able to create 
applications now!

To start creating applications with Google App Engine, simply follow this 
link:

https://appengine.google.com/

Thanks!
The Google App Engine Team



10 楼 dasheng 2010-01-13  
在官网下了sdk,看了一天了,基本有个印象。以后用到什么排名的时候肯定用的着,不过觉得查询那部分写的有些麻烦,看着好累!
9 楼 void1898 2010-01-12  
风中独火 写道
wmcoo 写道
Google App Engine的应用验证码怎么收不到
用的移动号码
+86135....
楼主是什么时候注册的


换个手机,或者是换别的运营商的手机,我刚刚用联通的手机是可以收到的.



貌似可以填一个报告单,跟Google说收不到,对方回处理的
8 楼 lordhong 2010-01-12  
多谢分享, GAE确实是个好东西, 不过很有可能被墙, 真可惜
7 楼 风中独火 2010-01-11  
wmcoo 写道
Google App Engine的应用验证码怎么收不到
用的移动号码
+86135....
楼主是什么时候注册的


换个手机,或者是换别的运营商的手机,我刚刚用联通的手机是可以收到的.
6 楼 wmcoo 2010-01-10  
Google App Engine的应用验证码怎么收不到
用的移动号码
+86135....
楼主是什么时候注册的
5 楼 raymondlueng 2010-01-10  
ahao99 写道
感谢楼主分享。问个问题:
步骤2.存取Bean(可以写在Servlet的doGet()或者doPost()里面):
这里bean的数据是从google服务器那边取得的吗?
多个用户取得的都是一样的值吗?

是从服务器取到的,多个用户取到的是一样的,当然,你可以加权限,决定什么样的用户获取什么样的数据!
4 楼 ahao99 2010-01-10  
感谢楼主分享。问个问题:
步骤2.存取Bean(可以写在Servlet的doGet()或者doPost()里面):
这里bean的数据是从google服务器那边取得的吗?
多个用户取得的都是一样的值吗?
3 楼 raymondlueng 2010-01-10  
BarryWei 写道
谢谢了,每次你分享你的经验,对大家来说都是一种提升,更是一种鼓舞。

大家一起进步啊,gae java方面的资料太少了,另外就是gap近来大有墙的趋势,不过如果是面对国外用户的android应用的话,gae还是可以使用的!
2 楼 springfield 2010-01-10  
以前对appengine只是有所耳闻,从来没有真正的用过,感谢楼主的分享,又多学了点东西,呵呵~
1 楼 BarryWei 2010-01-10  
谢谢了,每次你分享你的经验,对大家来说都是一种提升,更是一种鼓舞。

相关推荐

    android 开发中用json解析客户端与服务器端的代码

    游戏开发中客户端与服务器端数据的传输, URL url = new URL(path); //创建一个Url对象 //得到打开的链接对象 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //设置请求超时与请求...

    基于Android和java的音乐类游戏 ,基于java socket实现的服务器端代码.zip

    java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发...

    Android斗地主 论文

    系统包括PC服务器端和Android游戏客户端两大部分。客户端实现了注册、登录、游戏房间选择、多人斗地主等功能,而服务器端则可以同时接受多个用户的连接请求并可以对用户信息进行存储和管理。客户端和服务器间使用...

    Android 3D游戏开发技术宝典-OpenGL ES 2.0 (吴亚峰) 源代码

    2.6.2 服务器端 57 2.6.3 客户端 58 2.7 蓝牙通信 59 2.7.1 蓝牙通信的基本知识 60 2.7.2 聊天案例概览 60 2.7.3 聊天案例的开发过程 62 2.8 本章小结 75 第3章 初识opengl es 2.0 77 3.1 ...

    Android Web Game App高级编程 使用HTML5 CSS3 JavaScript

    就可以开启我们的Android Web Game App高级编程之旅 从一个空白的HTML网页开始 最后将收获多人在线游戏 有丰富多彩的图像 声音 动画等 开发必需的一些知识和技巧 即使你以前没有游戏开发和服务器端编程的经验 ...

    基于skynet的游戏服务器开发skynet.zip

    C#通常用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是.NET框架的一部分,这意味着它可以与其他.NET语言(如Visual Basic .NET、F#等)以及.NET框架中的各种库和工具进行交互使用...

    android开源麻将游戏

    Andjong 麻将游戏的源代码,是一个日本的开源项目,注释很多很详细(不过是日文的^_^),对麻将类游戏开发有较大的帮助。

    pvz双人对战版游戏服务器pvzServer.zip

    C#通常用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是.NET框架的一部分,这意味着它可以与其他.NET语言(如Visual Basic .NET、F#等)以及.NET框架中的各种库和工具进行交互使用...

    D3D9 第二版 mir2 游戏练习开发D3D9V2.zip

    C#通常用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是.NET框架的一部分,这意味着它可以与其他.NET语言(如Visual Basic .NET、F#等)以及.NET框架中的各种库和工具进行交互使用...

    SDL2开发的下游戏SDL2-game.zip

    C#通常用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是.NET框架的一部分,这意味着它可以与其他.NET语言(如Visual Basic .NET、F#等)以及.NET框架中的各种库和工具进行交互使用...

    项目有现在最流行的2D 游戏开发软件 CocosCreater 开发。.zip

    项目有现在最流行的2D 游戏开发软件 CocosCreater 开发。 可发布到 iOS Android H5 端。 项目类型为经典的闹铃系统。 软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python...

    UnitySetup-Android-2019.2.0a4.exe.zip

    非常难得的UnitySetup-Android-2019.2.0,用于开发安卓端3D游戏。由于被墙,国内无法在官方服务器下载,特意分享。 用于Unity3d 2019所有版本,包括64位和32位完美通过,特说明:使用者需要具备安卓SDK和ADK配置基本...

    疯狂Android讲义源码

     TCP服务器端 478  13.1.3 使用Socket进行通信 479  13.1.4 加入多线程 483  13.2 使用URL访问网络资源 488  13.2.1 使用URL读取网络资源 489  13.2.2 使用URLConnection  提交请求 490  13.3 使用HTTP访问...

    Android毕业设计——成语游戏.zip

    这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,...

    俄罗斯方块游戏,包含CC++ WebServer端,网页展示端TetrisGame.zip

    C#通常用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是.NET框架的一部分,这意味着它可以与其他.NET语言(如Visual Basic .NET、F#等)以及.NET框架中的各种库和工具进行交互使用...

Global site tag (gtag.js) - Google Analytics