设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

开发多玩家 Android 游戏时如何处理连接问题

2013-11-6 09:41| 发布者: 红黑魂| 查看: 4015| 评论: 0|来自: 开源中国编译

摘要:   我们开发了一款Android聊天室应用演示,使用了AppWarp(译注:Appwarp 是创建实时多用户游戏的跨平台网络引擎),而AppWarp引擎阐明了怎样处理间歇性的网络链接故障。这个演示用到了AppWarp的具有网络弹性的API。 ...

  我们开发了一款Android聊天室应用演示,使用了AppWarp(译注:Appwarp 是创建实时多用户游戏的跨平台网络引擎),而AppWarp引擎阐明了怎样处理间歇性的网络链接故障。这个演示用到了AppWarp的具有网络弹性的API。


  为什么需要网络弹性
在移动设备中,数据连接一直是一个问题。 当用户在移动中,数据源将经常切换基站,或者在2G和3G之间降级/升级,或切换WiFi,或由于屏幕锁定或用户按下home键使得应用程序切换到后台运行。 这对依赖持续数据连接的应用程序/游戏带来影响。AppWarp 提供了 强大的功能 来处理 网络弹性 问题, 用户可以通过它  连接丢失的 情况下,保持 应用 之前的 状态  

  想知道更多有关appwarp弹性:点击这里


包含两个 Activities 的应用 


MainActivity: Main Activity 允许用户连接到AppWarp服务端。用户输入他们的名字然后连接到AppWarp服务器。为了启用弹性特性(Resiliency Feature),你应该在初始化WarpClient之后设置默认恢复间隔(Recovery Allowance interval):

1private void init(){
2    WarpClient.initialize(Constants.apiKey, Constants.secretKey);
3    WarpClient.setRecoveryAllowance(120);
4    try {
5        theClient = WarpClient.getInstance();
6    catch (Exception ex) {
7        Toast.makeText(this"Exception in Initilization",
Toast.LENGTH_LONG).show();
8    }
9}

这会告诉服务器默认恢复时间间隔,在这个时间内,即使在连接丢失的情况下,服务端也不会销毁用户session。我们用AppHq 控制台创建了一个静态变量room。一旦连接并注册到这个room,我们就转向ChatActivity。


01public static final String roomId = "1469583531"// static room id defined in Const
02  
03@Override
04public void onSubscribeRoomDone(RoomEvent event) {
05    if(event.getResult()==WarpResponseResultCode.SUCCESS){
06        Intent intent = new Intent(this, ChatActivity.class);
07        startActivity(intent);
08    }else{
09        showToastOnUIThread("onSubscribeRoomDone Failed with ErrorCode: "+event.getResult());
10    }
11}


ChatActivity.java 这个 Activity 包含了发送/接收聊天逻辑,并且也管理聊天日志。上半部分包含了同一个room中参与用户的列表。绿色的状态指示意思是用户在线,灰色的意思是暂停(临时连接错误)。屏幕下半部分包含了用户发送的聊天记录。在这个activity的启动后,要想获取房间中的在线用户,我们可以调用

1theClient.getLiveRoomInfo(Constants.roomId);
随着onGetLiveRoomInfoDone的响应动作, 我们在用户列表适配器中加入参与用户。
01public void onGetLiveRoomInfoDone(final LiveRoomInfoEvent event) {
02    if(event.getResult()==WarpResponseResultCode.SUCCESS){
03        onlineUserList.clear();
04        if(event.getJoinedUsers().length>1){// if more than one user is online
05            final String onlineUser[] = Utils.removeLocalUserNameFromArray
(event.getJoinedUsers());
06            for(int i=0;i
07                User user = new User(onlineUser[i].toString(), true);
08                Log.d(onlineUser[i].toString(), onlineUser[i].toString());
09                onlineUserList.add(user);
10            }
11        resetAdapter();
12    }else{
13        showToastOnUIThread("No online user found");
14    }
15    }else{
16        showToastOnUIThread("onGetLiveRoomInfoDone Failed with ErrorCode:
"
+event.getResult());
17    }
18}

处理连接弹性:在任何原因任何用户与AppWarp服务器连接中断的情形下,服务端将维持连接直到预定义的恢复时间,不过它会给房间中的其他用户发送一个通知,告知某用户当前处于暂停状态。如果用户在定义的弹性时间内恢复连接状态,那么其他用户将获得该用户状态继续的通知。否则用户将收到OnUserLeftRoom通知,并且将该用户从OnlineUser列表中删除。维护暂停/继续状态:如果我们使用AppWarp弹性特性,在任何用户与AppWarp服务器中断连接时,我们将收到一个通知。

01@Override
02public void onUserPaused(String locid, boolean isLobby, String userName) {
03    for(int i=0;i
04        User user = onlineUserList.get(i);
05        if(user.getName().equals(userName)){
06            user.setStatus(false);
07        }
08    }
09    resetAdapter();
10}
11  
12@Override
13  
14public void onUserResumed(String locid, boolean isLobby, String userName) {
15    for(int i=0;i
16        User user = onlineUserList.get(i);
17        if(user.getName().equals(userName)){
18            user.setStatus(true);
19        }
20    }
21    resetAdapter();
22}


恢复连接:如果用户的网络连接由于某些原因中断了,比如在2G/3G/WiFi/towers之间进行切换,或者其它原因,我们会在ConnectonRequestListener中得到一个连接错误,其错误代码为WarpResponseResultCode.CONNECTION_ERROR_RECOVERABLE,通过检测该错误代码我们可以调用恢复连接的API来恢复我们之间的session。我们建议每隔5秒钟尝试进行一次重新连接。  

01theClient.RecoverConnection();
02  
03@Override
04public void onConnectDone(final ConnectEvent event) {
05    if(event.getResult() == WarpResponseResultCode.SUCCESS){
06        showToastOnUIThread("Connection success");
07    }
08    else if(event.getResult() == WarpResponseResultCode.SUCCESS_RECOVERED){
09        showToastOnUIThread("Connection recovered");
10        runOnUiThread(new Runnable() {
11        @Override
12        public void run() {
13        if(progressDialog!=null){
14            progressDialog.dismiss();
15        }
16        progressDialog = ProgressDialog.show(ChatActivity.this"""Please wait..");
17    }
18    });
19    theClient.getLiveRoomInfo(Constants.roomId);
20    }
21    else if(event.getResult() == WarpResponseResultCode.CONNECTION_ERROR_RECOVERABLE){
22        runOnUiThread(new Runnable() {
23        @Override
24        public void run() {
25            progressDialog = ProgressDialog.show(ChatActivity.this""
"Recoverable connection error. Recovering
session after 5 seconds"
);
26        }
27    });
28    handler.postDelayed(new Runnable() {
29    @Override
30    public void run() {
31        progressDialog.setMessage("Recovering...");
32        theClient.RecoverConnection();
33    }
34    }, 5000);
35    }
36    else{
37       showToastOnUIThread("Non-recoverable connection error."+event.getResult());
38        handleLeaveRoom();
39        this.finish();
40    }
41  
42}

源代码可以从我们的 git库上进行下载或查看。如果你有什么问题或者需要进一步的帮助,请随时跟我们联系:support@shephertz.com


开源中国编译:http://www.oschina.net/translate/handling-connection-resiliency-in-real-time-games

英文原文:How to handle Connection issues in Android devices while developing 

Multiplayer Games – AppWarp


参与翻译(3人)

酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部