現在開始正式寫代碼,上一篇講到客戶端與服務器交互的五種類型,這邊再提一下,因為我們游戲中的所有交互行為都是屬於其中之一的。有了這個做指導,代碼寫起來就輕松多了,只要先思考屬於哪一種類型,也就不會容易寫錯。
1.服務器主動發消息給所有客戶端 (例如同步時間,游戲大廳中發送玩家列表給客戶端)
2.客戶端發送消息給服務器,服務器發送消息給除該客戶端之外的所有客戶端 (例如許多實時RPG游戲中的移動,雖然也可以等服務器回應后再移動人物,但對於一直要進行操作的實時RPG來說,這種延時不太會影響游戲公平性.卻會大大影響操作流暢度和美感。不過對於有些競技游戲,比如LOL,是采用服務器回應客戶端的移動請求后,再進行移動的,因為這種游戲中,這點點延遲就會影響游戲公平。)
3.客戶端發送消息給服務器,服務器單獨回應該客戶端(例如玩家需要查看別人的信息,一般來說,這種都是即時請求的,但也有部分游戲可能將一些信息在游戲初始化時存到本地)
4.客戶端發送消息給服務器,服務器發送消息給另一指定客戶端(例如游戲中發送好友申請)
5.客戶端提交數據給服務器,不返回(例如玩家升了一級,則同步信息到服務器端的數據庫中,或玩家進入了一個房間,更新服務器的房間玩家列表,等待下一次返回給所有客戶端)
既然是要進行信息交互,就要有一種信息格式,使雙方都能夠處理,我們這邊采用的是這樣一種格式
|信息頭(6位數字)|信息1長度|信息2長度|......|信息1|信息2|.......|終止符號|
舉個例子,例如
Socket.send(Client.Login_Key + Account.length + Password.length + Account + Password+"\n");這是客戶端發送給服務器的登錄請求
以上變量的意義分別是
|登錄信息頭|賬號長度|密碼長度|賬號|密碼|終止符號|
例子2.
Socket.send(Client.CheckOthers_Key + account.length + account + "\n");
以上變量的意義分別是
|查看他人信息信息頭|他人賬號長度|他人賬號|終止符號|
有了信息格式當然服務器也不能直接使用,需要對該消息進行拆解才能使用服務器和客戶端有一個相同的拆解方法,這里只貼出服務器的,客戶端的只是語法不一樣而已
public static String[] decodeString(int a, String b) {
//等待返回的字符串數組
String[] returnString=new String[a];
int[] allArgs=new int[a];
for(int i=6;i<6+a;i++)
{
allArgs[i-6]=Integer.parseInt(b.substring(i,i+1));
}
for(int i=0;i
{
returnString[i]=b.substring(6+a+All(allArgs,i),6+a+All(allArgs,i)+allArgs[i]);
}
return returnString;
}
public static int All(int[] allArgs, int i) {
int a=0;
for(int b=0;b
a+=allArgs[b];
}
return a;
}該方法就可以將所有的信息存到一個數組中
具體使用方法舉例 比如上面的登錄請求字符串
Client.CheckOthers_Key + account.length + account + "\n"服務器進行拆解
String[] lines=Main.decodeString(2,line);這樣就把收到的信息line拆解為lines的數組,數組第一第二個位置分別放着提交的賬號和密碼,之后服務器就可以把這個參數傳給數據庫進行查詢了
當然,這是一種不嚴謹的做法,例如該方法就沒辦法同時拆解包含着N條內容的Y條信息,只能一次拆解一條包含着N條內容的信息,或者包含着1條內容的N條信息,所以遇到拆解不了的少數情況,還要再做特殊處理,這個之后再說
接下來介紹一下服務器和客戶端各自在本游戲中要編寫的類,以及他們的作用
服務器端
1.ClientThread類 該類綁定一個對應的客戶端,偵聽來自該客戶端的消息,拆解后進行處理
2.DBEngine類 該類處理要與數據庫交互的客戶端信息,例如注冊,登錄,更新人物數據等等
3.GUI類 該類是服務器的GUI,也可以沒有,全憑個人喜好
4.Main類 程序的入口,該類也保存了所有的信息頭,以及前面兩個拆解字符串的方法
5.ScanningThread類 該類是服務器端的定時掃描客戶端線程,用於執行之前說過的第五類交互
6.ServerSocketThread類 該類負責偵聽客戶端的Socket連接操作,並做一些初始化的工作
客戶端(有些東西和通信無關,就一筆帶過)
1.Client類 該類是客戶端與服務器通信的類,也是客戶端最重要的類
2.PlayerData類 該類保存了玩家數據,比如賬號,金錢之類,當然如果要進行更改,還是要通過服務器,例如購買道具,肯定要以數據庫中保存的人物金幣為准,否則本地用修改器改一下金幣數,就可以直接作弊了。所以這邊的數據,只是為了客戶端的顯示作用。
3.DialogBox類 客戶端GUI之一
4.PlayerInfoBox類 客戶端GUI之一
5.Bullet類 子彈類
6.Map類 地圖類
7.OtherPlayer類 該類是其他玩家在當前客戶端的"化身" 也就是說,該類只有收到其他客戶端的信息,才能夠做出反應。與之相對,當前客戶端對這些"化身"做操作,也會經由服務器傳給其他客戶端
8.PersonBase類 該類是人物類的基類
9.Player類 玩家所操控的英雄類
在制作游戲過程中,一般都將各個模塊分離出來進行開發,做完一個再做下一個。下一期這我們先來完成注冊功能。