自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

開(kāi)發(fā)多玩家 Android 游戲時(shí)如何處理連接問(wèn)題

移動(dòng)開(kāi)發(fā) Android
我們開(kāi)發(fā)了一款A(yù)ndroid聊天室應(yīng)用演示,使用了AppWarp(譯注:Appwarp 是創(chuàng)建實(shí)時(shí)多用戶游戲的跨平臺(tái)網(wǎng)絡(luò)引擎),而AppWarp引擎闡明了怎樣處理間歇性的網(wǎng)絡(luò)鏈接故障。這個(gè)演示用到了AppWarp的具有網(wǎng)絡(luò)彈性的API。

我們開(kāi)發(fā)了一款A(yù)ndroid聊天室應(yīng)用演示,使用了AppWarp(譯注:Appwarp 是創(chuàng)建實(shí)時(shí)多用戶游戲的跨平臺(tái)網(wǎng)絡(luò)引擎),而AppWarp引擎闡明了怎樣處理間歇性的網(wǎng)絡(luò)鏈接故障。這個(gè)演示用到了AppWarp的具有網(wǎng)絡(luò)彈性的API。

為什么需要網(wǎng)絡(luò)彈性: 在移動(dòng)設(shè)備中,數(shù)據(jù)連接一直是一個(gè)問(wèn)題。 當(dāng)用戶在移動(dòng)中,數(shù)據(jù)源將經(jīng)常切換基站,或者在2G和3G之間降級(jí)/升級(jí),或切換WiFi,或由于屏幕鎖定或用戶按下home鍵使得應(yīng)用程序切換到后臺(tái)運(yùn)行。 這對(duì)依賴(lài)持續(xù)數(shù)據(jù)連接的應(yīng)用程序/游戲帶來(lái)影響。AppWarp 提供了 強(qiáng)大的功能 來(lái)處理 網(wǎng)絡(luò)彈性 問(wèn)題, 用戶可以通過(guò)它 連接丟失的 情況下,保持 應(yīng)用 之前的 狀態(tài) 。

想知道更多有關(guān)appwarp彈性:點(diǎn)擊這里

包含兩個(gè) Activities 的應(yīng)用

Resilient Chat MainActivity How to handle Connection issues in Android devices while developing Multiplayer Games   AppWarp Resilient Chat ChatActivity How to handle Connection issues in Android devices while developing Multiplayer Games   AppWarp


MainActivity: Main Activity 允許用戶連接到AppWarp服務(wù)端。用戶輸入他們的名字然后連接到AppWarp服務(wù)器。為了啟用彈性特性(Resiliency Feature),你應(yīng)該在初始化WarpClient之后設(shè)置默認(rèn)恢復(fù)間隔(Recovery Allowance interval):

 

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

這會(huì)告訴服務(wù)器默認(rèn)恢復(fù)時(shí)間間隔,在這個(gè)時(shí)間內(nèi),即使在連接丟失的情況下,服務(wù)端也不會(huì)銷(xiāo)毀用戶session。我們用AppHq 控制臺(tái)創(chuàng)建了一個(gè)靜態(tài)變量room。一旦連接并注冊(cè)到這個(gè)room,我們就轉(zhuǎn)向ChatActivity。

  1. public static final String roomId = "1469583531"// static room id defined in Constant.java   
  2.  
  3.     
  4.  
  5.  @Override  
  6.  
  7.  public void onSubscribeRoomDone(RoomEvent event) {   
  8.  
  9.      if(event.getResult()==WarpResponseResultCode.SUCCESS){   
  10.  
  11.         Intent intent = new Intent(this, ChatActivity.class);   
  12.  
  13.          startActivity(intent);   
  14.  
  15.      }else{   
  16.  
  17.         showToastOnUIThread("onSubscribeRoomDone Failed with ErrorCode: "+event.getResult());   
  18.  
  19.     }   
  20.  
  21.  }  

ChatActivity.java 這個(gè) Activity 包含了發(fā)送/接收聊天邏輯,并且也管理聊天日志。上半部分包含了同一個(gè)room中參與用戶的列表。綠色的狀態(tài)指示意思是用戶在線,灰色的意思是暫停(臨時(shí)連接錯(cuò)誤)。屏幕下半部分包含了用戶發(fā)送的聊天記錄。在這個(gè)activity的啟動(dòng)后,要想獲取房間中的在線用戶,我們可以調(diào)用

  1. theClient.getLiveRoomInfo(Constants.roomId); 

隨著onGetLiveRoomInfoDone的響應(yīng)動(dòng)作, 我們?cè)谟脩袅斜磉m配器中加入?yún)⑴c用戶。

  1. public void onGetLiveRoomInfoDone(final LiveRoomInfoEvent event) {   
  2.  
  3.      if(event.getResult()==WarpResponseResultCode.SUCCESS){   
  4.  
  5.          onlineUserList.clear();   
  6.  
  7.          if(event.getJoinedUsers().length>1){// if more than one user is online   
  8.  
  9.             final String onlineUser[] = Utils.removeLocalUserNameFromArray(event.getJoinedUsers());   
  10.  
  11.              for(int i=0;i<onlineUser.length;i++){   
  12.  
  13.                  User user = new User(onlineUser[i].toString(), true);   
  14.  
  15.                  Log.d(onlineUser[i].toString(), onlineUser[i].toString());   
  16.  
  17.                 onlineUserList.add(user);   
  18.  
  19.              }   
  20.  
  21.         resetAdapter();   
  22.  
  23.     }else{   
  24.  
  25.         showToastOnUIThread("No online user found");   
  26.  
  27.      }   
  28.  
  29.     }else{   
  30.  
  31.        showToastOnUIThread("onGetLiveRoomInfoDone Failed with ErrorCode: "+event.getResult());   
  32.  
  33.     }   
  34.  
  35. }  

處理連接彈性:在任何原因任何用戶與AppWarp服務(wù)器連接中斷的情形下,服務(wù)端將維持連接直到預(yù)定義的恢復(fù)時(shí)間,不過(guò)它會(huì)給房間中的其他用戶發(fā)送一個(gè)通知,告知某用戶當(dāng)前處于暫停狀態(tài)。如果用戶在定義的彈性時(shí)間內(nèi)恢復(fù)連接狀態(tài),那么其他用戶將獲得該用戶狀態(tài)繼續(xù)的通知。否則用戶將收到OnUserLeftRoom通知,并且將該用戶從OnlineUser列表中刪除。維護(hù)暫停/繼續(xù)狀態(tài):如果我們使用AppWarp彈性特性,在任何用戶與AppWarp服務(wù)器中斷連接時(shí),我們將收到一個(gè)通知。

  1. @Override  
  2.  
  3. public void onUserPaused(String locid, boolean isLobby, String userName) {   
  4.  
  5.    for(int i=0;i<onlineUserList.size();i++){   
  6.  
  7.         User user = onlineUserList.get(i);   
  8.  
  9.         if(user.getName().equals(userName)){   
  10.  
  11.            user.setStatus(false);   
  12.  
  13.         }   
  14.  
  15.    }   
  16.  
  17.     resetAdapter();   
  18.  
  19. }   
  20.  
  21.       
  22.  
  23.  @Override  
  24.  
  25.     
  26.  
  27.  public void onUserResumed(String locid, boolean isLobby, String userName) {   
  28.  
  29.      for(int i=0;i<onlineUserList.size();i++){   
  30.  
  31.         User user = onlineUserList.get(i);   
  32.  
  33.          if(user.getName().equals(userName)){   
  34.  
  35.            user.setStatus(true);   
  36.  
  37.          }   
  38.  
  39.      }   
  40.  
  41.    resetAdapter();   
  42.  
  43. }  

恢復(fù)連接:如果用戶的網(wǎng)絡(luò)連接由于某些原因中斷了,比如在2G/3G/WiFi/towers之間進(jìn)行切換,或者其它原因,我們會(huì)在ConnectonRequestListener中得到一個(gè)連接錯(cuò)誤,其錯(cuò)誤代碼為WarpResponseResultCode.CONNECTION_ERROR_RECOVERABLE,通過(guò)檢測(cè)該錯(cuò)誤代碼我們可以調(diào)用恢復(fù)連接的API來(lái)恢復(fù)我們之間的session。我們建議每隔5秒鐘嘗試進(jìn)行一次重新連接。 

  1. theClient.RecoverConnection();   
  2.  
  3.      
  4.  
  5. @Override  
  6.  
  7. public void onConnectDone(final ConnectEvent event) {   
  8.  
  9.    if(event.getResult() == WarpResponseResultCode.SUCCESS){   
  10.  
  11.         showToastOnUIThread("Connection success");   
  12.  
  13.   }   
  14.  
  15.    else if(event.getResult() == WarpResponseResultCode.SUCCESS_RECOVERED){   
  16.  
  17.         showToastOnUIThread("Connection recovered");   
  18.  
  19.         runOnUiThread(new Runnable() {   
  20.  
  21.         @Override  
  22.  
  23.          public void run() {   
  24.  
  25.         if(progressDialog!=null){   
  26.  
  27.              progressDialog.dismiss();   
  28.  
  29.         }   
  30.  
  31.         progressDialog = ProgressDialog.show(ChatActivity.this"""Please wait..");   
  32.  
  33.      }   
  34.  
  35.    });   
  36.  
  37.     theClient.getLiveRoomInfo(Constants.roomId);   
  38.  
  39.     }   
  40.  
  41.     else if(event.getResult() == WarpResponseResultCode.CONNECTION_ERROR_RECOVERABLE){   
  42.  
  43.         runOnUiThread(new Runnable() {   
  44.  
  45.         @Override  
  46.  
  47.         public void run() {   
  48.  
  49.            progressDialog = ProgressDialog.show(ChatActivity.this"""Recoverable connection error. Recovering session after 5 seconds");   
  50.  
  51.         }   
  52.  
  53.     });   
  54.  
  55.      handler.postDelayed(new Runnable() {   
  56.  
  57.      @Override  
  58.  
  59.     public void run() {   
  60.  
  61.          progressDialog.setMessage("Recovering...");   
  62.  
  63.          theClient.RecoverConnection();   
  64.  
  65.     }   
  66.  
  67.     }, 5000);   
  68.  
  69.      }   
  70.  
  71.      else{   
  72.  
  73.        showToastOnUIThread("Non-recoverable connection error."+event.getResult());   
  74.         handleLeaveRoom();   
  75.  
  76.        this.finish();   
  77.  
  78.      }   
  79.  
  80.      
  81.  
  82.  }  

源代碼可以從我們的 git庫(kù)上進(jìn)行下載或查看。如果你有什么問(wèn)題或者需要進(jìn)一步的幫助,請(qǐng)隨時(shí)跟我們聯(lián)系: support@shephertz.com

責(zé)任編輯:張葉青 來(lái)源: 開(kāi)源社區(qū)
相關(guān)推薦

2014-06-03 09:35:19

Javalibgdx

2010-05-17 10:04:45

2011-12-15 12:32:19

JavaNIO

2011-12-08 09:23:26

2014-09-01 10:56:52

WP8

2022-09-06 10:26:38

前后端分離Vue跨域

2010-09-01 15:40:10

DHCP服務(wù)器

2011-12-24 21:59:02

iPhone

2023-04-06 15:19:51

2021-08-11 16:57:03

數(shù)據(jù)中心光纖布線電纜管理

2012-08-29 10:12:13

人才創(chuàng)業(yè)硅谷

2025-03-31 09:59:11

2023-07-04 10:16:36

IT員工IT團(tuán)隊(duì)主管

2017-06-08 20:56:37

2012-12-28 15:53:53

面試應(yīng)屆畢業(yè)生

2013-03-20 11:01:37

Redis客戶端連接

2020-04-06 11:56:04

黑客網(wǎng)絡(luò)威脅網(wǎng)絡(luò)攻擊

2010-03-17 16:35:11

2012-12-12 09:49:41

2017-03-13 13:21:34

Git處理大倉(cāng)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)