程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 手機網游制造之請求處理篇

手機網游制造之請求處理篇

編輯:關於JAVA

開發程序:瘋狂的炸彈

開發進度:第四期

本期要點:設計服務器端請求處理功能

開發平台:java平台

經過前面3期的講解,我們的手機網游《瘋狂的炸彈》大體已經完成,在加上上本期開發的請求處理功能,就OK啦。快來試試我們的《瘋狂的炸彈》吧(游戲下載地址:http://www.shudoo.com/bzsoft)。

既然是手機網游,自然客戶端的數量就會比較多,所以多個客戶端同時向服務器端發送請求的情況很常見。為了更好的運行,服務器端需要同時處理多個客戶端的請求,這就是用到並發處理。下面就隨著我們一起學習手機網游是如何並發處理多個客戶端的請求的。

請求處理設計思路

在《瘋狂的炸彈》程序的服務器端請求處理功能中,沒有采用“線程池”技術,而是直接采用當一個客戶端連接請求到達時,啟動一個新的線程進行處理,在連接完成以後關閉線連接程。

通過為每個連接的客戶端設置新的線程,很容易就實現了處理多個客戶端的要求,使得多個客戶端可以同時工作(圖1)。在每個線程的內部,先根據客戶端網絡協議格式規定,解析客戶端發送過來的請求數據,然後依據不同的請求命令分別進行處理。

如何並發處理

由於服務器端需要同時處理多個客戶端發送的請求,所以需要對核心的數據進行並發處理,這樣才能解決數據同步的問題。下面以分配用戶ID為例子,來介紹服務器端並發處理的過程。客戶端第一次連接服務器端時,服務器端反饋一個唯一的序號給客戶端。服務器端每派發一個ID,ID的值就加1。

如果多個客戶端同時發送請求,服務器端計數就有可能出錯。使用Java語言中的synchronized關鍵字修飾處理邏輯,可以解決這個問題。使用該函數反饋的userID(圖2),可以保證在多個客戶端同時訪問的情況下數據的同步。

設計服務端網絡協議

服務器端網絡協議,最主要的功能就是將服務器端的處理結果數據反饋給客戶端,從而控制客戶端的邏輯行為。在設計服務器端網絡協議時,需要考慮有幾種反饋指令以及每種反饋需要反饋的參數等。此外,還要考慮如何減少數據的重復。

服務器端的網絡協議中的成功指令用於響應客戶端的准備指令,在客戶端登錄成功以後,向服務器端發送開始指令,如果服務器端無法匹配對戰用戶,則反饋繼續等待指令,這樣客戶端將繼續等待其他玩家。如果有其他玩家匹配或已經由服務器匹配給其他玩家對戰,則反饋初始數據指令,並反饋服務器端生成的房間編號、初始地圖數據、角色數據等。

在游戲開始以後,客戶端每隔一定時間發出獲得數據指令,服務器端反饋游戲刷新指令,將當前游戲數據反饋給客戶端。客戶端發送的移動指令等,直接在服務器端進行處理,不反饋指令。

請求處理設計步驟

第一步:創建項目

啟動Eclipse,選擇“File→New→Java Project”,設置項目名稱為“BomberServer”,並一路選擇“Next”, 完成項目的建立。然後新建一個入口類,選擇“File→New→Class”,設置名稱為“Server”,點擊“Finish”。創建項目的代碼下載地址是http://www.shudoo.com/bzsoft。

第二步:設計游戲線程類

選擇“File→New→Class”,並設置名稱為“LogicThread”,點擊“Finish”完成游戲線程類的創建,該類讀取客戶端發送數據以及向客戶端發送數據。關鍵碼如下所示(完整代碼下載地址:http://www.shudoo.com/bzsoft):

//讀取數據
byte[] b = new byte[1024];
is = s.getInputStream();
int n = is.read(b);
byte[] request = getData(b,n);
//數據錯誤處理
if(request.length == 0){
return;   //結束程序
}
//處理邏輯 
byte[] response = doLogic(request);
//如果反饋為null,則結束處理
if(response == null){
return;
}
//反饋給客戶端
os = s.getOutputStream();
//HTTP協議信息
os.write("HTTP/1.1 200 OK\n\r".getBytes());
os.write("accept:*.*\n\r\n".getBytes());
os.write(response);

第三步:設計網絡協議指令接口

選擇“File→New→Interface”,設置名稱為“ResponseCommand”,點擊“Finish”完成游戲網絡協議接口的創建,該接口包含所有網絡協議指令的代碼。關鍵碼如下所示(完整代碼下載地址:http://www.shudoo.com/bzsoft):

/**准備成功*/
public final static byte READY_OK = 0x0;
/**繼續等待*/
public final static byte CONTINUE_WAIT = 0x1;
/**初始數據*/
public final static byte INIT_DATA = 0x2;
/**游戲刷新數據*/
public final static byte GAME_DATA = 0x3;

第四步:運行程序

在Eclipse主界面左側的“Package Explorer”中,選中項目源代碼Server.java,單擊鼠標右鍵,選擇“Run As→Java Application”即可運行程序。

總結

經過四期的設計,手機網游《瘋狂的炸彈》就開發完成了,我們設計網絡協議以及網絡程序框架的思路,都是設計其他手機網絡程序可以借鑒的。由於我們開發《瘋狂的炸彈》的目的不是為了盈利,所以在一些細節上還比較欠缺。

開發實際的手機網游程序,還要考慮網絡連接的時間、各個手機機型的網絡設置、CMWAP和CMNET聯網代碼的區別、移動計費頁面的處理、優化網絡數據的傳輸和服務器端的數據存儲。

對初次進行手機網游開發的程序員,建議先開發比較簡單的網絡程序,例如對戰類的棋牌游戲或回合制游戲等,然後再開發復雜的游戲類型。設計網絡協議時,要盡量減少網絡實際數據的傳輸,這樣既可以提高程序的執行效率,也可以降低網絡流量。

到此為止,手機編程就將轉入問答為主的互動了,大家可以在數動連線網站的編程板塊中交流手機編程的問題,也可以在手機開發群中討論。下期開始,我們將重點關注開心農場之類的編程,敬請關注。

讀者反饋

開發qq群:看了上期的文章,我有一個疑問,如何減少客戶端跟服務器端之間的流量呢?

小編:編寫手機網絡程序,減少客戶端和服務器端的流量是一個必須考慮的問題。減少客戶端和服務器端之間的流量,可以從兩個方面進行考慮。

1.減少客戶端和服務器端之間的通訊頻率,也就是減少單位時間內通訊的次數,擴大通訊之間的實際間隔。2.優化網絡協議設計,優化協議設計減少每次傳輸的數據數量。同時使用這兩個方式,可以顯著降低客戶端和服務器端之間的流量。

開發QQ群:我比較好奇,手機網游的服務器端放在哪裡?也是在租用的服務器裡面嗎?

小編:手機網游的服務器端和普通的網游服務器端一樣,都需要一個專門的服務器進行運行,只要該服務器滿足在互聯網擁有一個固定的域名或IP地址即可。服務器可以租用,也可以由公司自己搭建,不過一般都是自己搭建的。

讀者問題:我的公司要開發藥品管理系統,要支持PDA,能給我一些建議嗎?

辛濤:要支持PDA有兩種形式,一種方式是跟PC端一樣用B/S架構,在PDA上使用浏覽器訪問管理系統即可。另一種方式是開發PDA上的客戶端,通過網絡直接操作服務器端的數據庫。前一種方式實現簡單,但不支持離線操作;後一種方式需另外開發客戶端,但速度快、支持離線操作。你根據公司的實際情況來酌情選擇吧。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved