您现在的位置: J2ME开发网 >> Java技术 >> 技术动态 >> 文章正文
[SNAP]实例讲解移动QQ在线平台
作者:陈曦    文章来源:本站原创    点击数:    更新时间:2006-4-23

[SNAP]实例讲解移动QQ在线平台

简单介绍SNAP Mobile的架构

编写者

日期

关键词

陈曦@exce4

2006- 4-15

SNAP Mobile API  Http  TCP  J2ME

SNAP的概念

SNAP,即Scalable Network Application Package,翻译为可缩放的网络应用解决方案

SNAP Mobile APIsNokia公司和SUN公司提供给全球众多移动游戏开发者的基于Nokia SNAP 移动平台(像N-Gage Arena.)和Sun Java Wireless Toolkit (version2.3)的一个功能强大的J2ME客户端的API开发包。SNAP APIs中提供了基于可高效拓展服务的手机多人在线游戏的开发环境,可以使开发者很方便的为程序添加网络特性,比如注册、登陆、即时通信、多人在线游戏、认证、好友列表、聊天、游戏积分排行、用户帐户和个人信息等游戏特性,大大地简化进行手机多人在线游戏J2ME程序的开发工作。

 

SNAP Mobile具有三大特点:

l         具有游戏社区功能(IMPS services)

l         具有在线游戏功能(SNAP Game services)

l         具有交流社区功能(Web services)

 

 

也就是说,你可根据你的项目特点有选择地进行开发。

商业应用示范

snapmobile给出了一些与nokia合作的手机游戏开发商的展示:

http://snapmobile.nokia.com/n-gage/web/en/snapmobile/games.jsp

Octopi Game Development Studio也有很好的示范,你可以浏览

http://www.octopi.com/snap.htm

从那里你能得到一个很好的概念。

到底SNAP Mobile是什么?

对于移动游戏开发者来说,它其实就是多人在线游戏的开发工具。通过它你可以实现手机注册、登陆、进入游戏大厅或者游戏房间进行多种模式的游戏对战。

 

它的构架是这样的:

 

 

对于客户端移动游戏开发者来说,只要实现了客户端访问到服务器,能发出请求,完成登陆、接收信息以及其他的一些社区功能而后登出服务器的话,基本就完成客户端的开发。

Nokia的产业链中,整个开发运作流程是这样的:

 

 

可以看到Nokia有一整套规范的操作流程和成熟的商业运作模式。想了解得更多的话,可以自己仔细查询:

http://snapmobile.nokia.com/n-gage/web/en/snapmobile/process.jsp

 

只要与Nokia提供的服务器端模拟器完成上述功能,就可以进行SNAP Mobile开发,而不需要在真实的通讯网络里完成。这就大大节约了开发成本,提高效率,也使开发者能回到核心业务,集中精力在游戏开发上,而不需要再费过多的资源关注通讯的细节。

   

我们下面具体讲解一下SNAP客户端登陆模拟服务器的示例。

简单的登陆示例

下载开发工具:

1。下载SNAP Mobile Client SDK

http://www.forum.nokia.com/main/0,6566,034-1021,00.html

2。下载Sun Java Wireless Toolkit 2.3 Beta

http://java.sun.com/products/sjwtoolkit/download-2_3.html

注意,必须要求用Sun Java Wireless Toolkit 2.3。安装它时候,虽然出现的还是WTK2.2版本字样,但不要怀疑。启动时它的界面不再是黄、红、蓝的强势界面,而且友好的浅蓝界面。)

安装完成后,接着就是启动WTK2.3,新建一个项目。例如:

新建 SNAPTest 项目,Midlet的类名为 test.HelloWorld。保持原来的默认设置,其他的可选包都不用选择。

在设置的外部api External  APIs里面会看到一个 sm-ui-api.jar的选项,还有一个Bundle的选项,都打上勾

 

然后在安装SNAPMobile的目录下找到 samples文件夹,把samples\HelloWorld\src 目录下的 test 文件复制到WTK2.3的文件夹 WTK2.3\apps\SNAPTest\src目录下

 

然后打开设置在权限许可 Permission的地方添加访问权限的API

MIDlet-Permissions: javax.microedition.io.Connector.socket

MIDlet-Permissions:javax.microedition.io.Connector.http

 

接着是设置用户自定义 User Defined  ,在里面添加连接信息:

 

SNAP-Mobile-Host: localhost

        SNAP-Mobile-Port: 8080

        SNAP-Mobile-Protocol: http

        username: test1

        password: test

 

   

 

在安装SNAPMobile的目录下找到 lib 文件夹,把 sm-api.jar复制到WTK2.3\apps\SNAPTest\lib目录下。然后编译生成。

 

启动安装SNAPMobile的目录下SNAPMobile\tools\ServerEmulator的服务器端模拟器 emu.bat,会出现一个DOS运行框,里面有发布信息,然后再运行客户端的模拟器,就会出现欢迎信息,完成登陆。

 

 

可能看完这个示例后,你对SNAP Mobile 有了一个初步的概念。下面我们再深入一点地介绍整个SNAP Moile的构架和实现。

 

通过以下HelloWorld.java的主要部分代码:

 

HelloWorld.java

 

public class HelloWorld extends MIDlet implements Runnable, SnapEventListener {

    /***开始运行***/

    public void startApp() {               

        /***初始化获取访问权限***/

        protocol = getAppProperty("SNAP-Mobile-Protocol");

        hostname = getAppProperty("SNAP-Mobile-Host");

        port = Integer.parseInt(getAppProperty("SNAP-Mobile-Port"));

        username = getAppProperty("username");

        password = getAppProperty("password");

        gameClassID = 49152;

        thread = new Thread(this);

        thread.start();      

    }

    /***线程运行***/

    public void run() {                   

        try {   /***创建服务器连接对象(主机名,端口号,协议)***/   

           comm = new ServerComm(hostname, port, protocol);

           /***添加snap事件监听器到该对象***/

            comm.addSnapEventListener(this);   

            /***统一登陆SNAP,IMPSWeb 服务器(用户名,密码,游戏类ID,显示属性)***/       

                comm.extendedLogin(username, password, gameClassID, null);

                /***发送信息***/

                comm.sendBuddyMessage(username, "Hello World!");   

         } catch (Exception e) {       }

         /***该对象移除snap事件监听器***/

         comm.removeSnapEventListener(this); 

         /***统一登出服务器***/    

         comm.unifiedLogout();

    }   

    /***处理事件***/

public void processEvents(Vector list) {     

    ItemList il;     

        for (int i=0; i<list.size(); i++) {     

        /***获取所有来自服务器的信息***/

          il = (ItemList)list.elementAt(i);

          switch(il.getInteger("id")) {

             case ItemList.IMPS_IM_MESSAGE:

               console.println("- IMPS_IM_MESSAGE EVENT", Console.YELLOW);

               console.println("  from id: " + il.getString("fromID"), Console.WHITE);

               console.println("  from name: " + il.getString("fromName"), Console.WHITE);

               console.println("  location: " + il.getString("location"), Console.WHITE);

               console.println("  message: " + il.getString("message"), Console.WHITE);

               if (username.equals( il.getString("fromName"))) {

                done = true;

                console.println("Message from ourself, done!", Console.WHITE);

              } else {

                 console.println("Message from someone else, not done.", Console.WHITE);                   

              }

              break;

            }

        }

    }

}

 

我们可以清楚地看到,Nokia已经在SNAPMobile里面已经封装好了连接接口和连接框架。让我们登陆SNAPMobile服务器成为一件很简单的事情。

(具体细节可以参考《SNAP_Mobile_HelloWorld_Tutorial_v1_0_en.pdf》的章节)

 

说到连接接口和连接框架咱们就不能跳过实现SNAP Mobile的通信协议。

HttpTCP

SNAP Mobile规范里面明确写着支持HttpTCP协议:

 

l         Http 使用 8080 端口;

l         TCP  使用 8976 端口;

 

Nokia的服务器端模拟器提供了修改相关协议、端口的命令。

说到这里不得不向各位说明一点,目前(从2006320日至419止)Nokia官方论坛snapmobile.nokia.com总共提供了两个性能不同的服务器端模拟器,各自针对的Demo

SNAP Mobile SDK自带工具包里的ServerEmulator主要是针对samples\HelloWorld的演示,开发指南和readme说明上都介绍说可以在DOS状态通过输入:

C:\ ServerEmulator>emu  -protocol tcp –port 8976

来完成相关协议和端口的修改,可是多次尝试,均未能修改成功。而性能不稳定。但可以通过客户端模拟器添加好友名单来修改服务器端resource\users文件夹下的用户数据。

snapmobile.nokia.com下载的sm-serv-em 则是可以emu <port_number>来修改端口。虽然性能稳定,但是取消了通过客户端模拟器修改服务器端的用户数据的功能,只能人工手动修改。

 

配置访问权限

从上面的上例可以知道客户端可以通过以下代码来获取本地设置的访问权限:

 

getAppPropert

        protocol = getAppProperty("SNAP-Mobile-Protocol");

        hostname = getAppProperty("SNAP-Mobile-Host");

        port     = Integer.parseInt(getAppProperty("SNAP-Mobile-Port"));

        username = getAppProperty("username");

        password = getAppProperty("password");

 

而访问权限的设置除了要在客户端本地设置以外,在服务器端也是需要设置的。在客户端我们将在用户自定义 User Defined里面添加如下信息来设置访问权限。

KEY

Value

SNAP-Mobile-Protocol

http

SNAP-Mobile-Host

localhost

SNAP-Mobile-Port

8080

username

test1

password

test

而在服务器端的设置,我们则在服务器端模拟器的\resource文件夹下进行:

上例可通过修改*.cfg配置文件的内容来修改属性和设置。

 

配置文件

Value

gameclasses.cfg

游戏类ID 游戏名

snapserver.cfg

创建游戏厅:游戏厅名

lobbies\49152_lobbies.cfg

游戏厅名

ranking\Test\table.cfg

排名表

ranking\Test\STAT

用户名 积分 时间

 

同时也可以手动修改users文件夹下的用户数据文件来设置用户的信息:

 

1000000X.dat

Value

user-id

1000000X

user-name

用户名

password

密码

buddy-list

好友列表

 

(具体细节参考《SNAP_Mobile_Community_Service_Emulator_Guide_v1_0_en.pdf》的章节)