`

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游戏(含服务器部分)

    《Android游戏开发:基于SurfaceView的坦克大战》 在Android平台上的游戏开发中,SurfaceView是一种常见的用于处理连续动画和游戏画面更新的视图组件。本项目“Android游戏(含服务器部分)”聚焦于利用SurfaceView...

    Android Socket编程客户端服务器端源码

    本教程将深入探讨Android Socket编程的基本概念、客户端与服务器端的实现以及相关源码解析。 一、Socket基本概念 Socket,也被称为套接字,是网络通信中的一个重要接口,它为两台设备提供双向通信的通道。在Android...

    Android手机游戏服务器端Server源代码

    在Android手机游戏开发中,服务器端扮演着至关重要的角色,它是连接客户端(即手机游戏应用)与游戏逻辑、数据存储的核心桥梁。本资源提供的是一个完整的Android手机游戏服务器端Server的源代码,对于理解游戏服务器...

    基于Android的3D游戏开发——国际象棋.zip

    在Android游戏开发中,3D游戏开发通常使用Java语言,因为它是Android SDK的主要编程语言。开发者可能利用了OpenGL ES(OpenGL for Embedded Systems)这一图形库,它是Android系统支持的用于2D和3D图形渲染的API。...

    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实现远程控制PC(Android[客户端]+Qt[服务器端])

    在本项目中,我们探索了如何使用Android设备作为客户端,通过Qt应用程序作为服务器端,实现远程控制个人计算机(PC)的功能。这个系统允许用户通过他们的Android手机执行一系列在PC上的操作,增强了移动设备的实用性...

    精通Android游戏开发

    "精通Android游戏开发"这个主题涵盖了从基础到高级的各类知识点,旨在帮助开发者构建高质量、高性能的游戏应用。Android游戏开发不仅涉及编程语言,如Java或Kotlin,还包括图形设计、物理模拟、音频处理等多个方面。...

    Android 游戏开发宝典光盘

    《Android游戏开发宝典》是一本深度探讨Android游戏开发的专业书籍,其附带的光盘包含书中所有示例项目的源代码,这对于学习者来说是一份极其宝贵的资源。这份压缩包文件,名为“源代码”,正是这些示例项目的集合,...

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

    在游戏开发中,服务器端的角色至关重要。它可能负责游戏状态的同步,确保多玩家之间的交互公平且一致。此外,服务器还可能存储和管理玩家数据,例如分数、成就等,以及处理游戏内的经济系统,如虚拟货币交易。 关于...

    游戏开发教程系列书籍整理 iOS Android Unity3d flash网页游戏 移动应用 端游.pdf

    书籍深入探讨了Android游戏开发的关键技术,如Java或Kotlin语言的应用、Android SDK的使用、OpenGL ES图形渲染、游戏网络通信等,旨在帮助开发者掌握在Android平台上构建高性能游戏的方法。 ### Unity3D游戏开发 ...

    基于Android的网络游戏开发——易扑克网络对战游戏.zip

    在本项目中,"基于Android的网络游戏开发——易扑克网络...通过这个项目,开发者可以深入了解Android游戏开发的各个方面,从客户端到服务器端,从基础架构到用户体验,从网络通信到游戏逻辑,都是学习和实践的好机会。

    netty4 Android客户端和服务器端

    在本文中,我们将深入探讨如何使用 Netty 4.0.31.Final 版本构建 Android 客户端和服务器端应用程序。 首先,Netty 提供了一种简化网络编程的方式,它通过非阻塞 I/O 和 Channel 抽象来处理并发连接。在 Android 上...

    基于AndroidStudio开发的扑克牌计算24点APP

    不过在这个项目中,JavaScript并未直接用于原生应用开发,而是可能被用作与服务器端交互或实现特定功能的辅助脚本。 在实际的项目开发过程中,开发者首先需要设计应用的架构。对于24点游戏,可能包含主界面、游戏...

    Android环境下Socket编程,服务器端和客户端通讯

    在本文中,我们将深入探讨如何在Android平台上实现服务器端和客户端的Socket通讯,以及如何创建9999端口进行数据交互。 首先,我们需要理解Socket的基本概念。Socket在计算机网络中是一种进程间通信机制,它提供了...

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

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

    类大富翁的android游戏

    《类大富翁的Android游戏开发详解》 在Android平台上,开发一款类大富翁的游戏是一种有趣且富有挑战性的实践。大富翁游戏的核心玩法包括掷骰子移动、购买地产、收取租金等,这些都需要通过编程来实现。下面,我们将...

    Android网络编程-聊天室开发

    本资料详细介绍了如何在Android平台上使用Socket进行网络编程,并通过具体的示例代码展示了聊天室的开发过程,包括服务器端和Android客户端的开发。 #### 二、服务器端程序开发 服务器端程序通常运行在一台PC机上...

    android开源麻将游戏

    Andjong是一款基于Android平台的开源麻将游戏,其源代码提供了丰富的学习资源,对于想要深入了解Android游戏开发,尤其是麻将类游戏开发的开发者来说,是一个不可多得的实践案例。这款项目由日本开发者贡献,尽管...

    Android游戏中国象棋源代码

    - 对战匹配、好友系统和实时聊天功能则需要服务器端的支持。 总之,分析并学习这款Android中国象棋游戏的源代码,不仅可以掌握Android开发的基本技术,还能深入了解游戏开发的算法设计和优化策略。无论是对于初学...

Global site tag (gtag.js) - Google Analytics