1. 程式人生 > >棋牌高防服務器架設教程

棋牌高防服務器架設教程

導致 兩個 ++ car 周期 code 字節 imp public

棋牌高防服務器架設教程q8803582

一個多人在線的棋牌類網絡遊戲的項目臨近尾聲,我參與了該項目的整個設計流程,並且完成了90%的核心代碼。關於這個項目,有很多地方值得聊一聊。本系列不打算把這個項目將得多麽詳細規範,那是設計文檔應該描述的,我打算只說說一些值得註意的地方。這個項目的一個特別之處是,客戶端是手機,用戶通過移動網絡與服務器通信。和PC相比,手機的處理能力極弱,而且網絡流量費用昂貴。因為除了要考慮普通網絡遊戲的一些問題之外,這兩點也需要在設計中充分考慮。首先是開發語言的選擇,由於服務器是Linux的環境,MS的技術直接排除,至於MONO嘛,我實在不放心。可供選擇的是C++和Java,Java勝在網絡能力強大,開發周期短,有眾多框架和開源庫的支持,要寫出爛得不可接受的代碼也不容易;C++則勝在速度快。綜合各方面因素,C++更容易把這個項目變成一堆代碼噩夢,我們選擇了Java。

一、網絡

網絡遊戲,首先面臨的問題當然是如何進行網絡通信。首先考慮的是HTTP協議,因為所有的J2ME手機都支持這個,我們當然想盡可能的兼容用戶。而且HTTP協議封裝程度已經非常高了,不用去考慮線程、同步、狀態管理、連接池,不過HTTP協議有兩個不爽的地方:
  ◇ 協議無狀態,這個問題已經困擾過很多人很多次了。我曾考慮過的解決辦法是改造HTTP協議,在數據傳輸完成之後不關閉socket,但是這樣做工作量非常大,在項目周期中,基本上就是Mission impossible,不予考慮。那麽客戶也就只能通過輪詢的方式向服務器請求數據。
  ◇ 網絡流量過大。就這個項目來說,網絡間傳遞的只是指令,但是每次傳遞都要加上一堆毫無用處的HTTP Head,再加上客戶端需要做輪詢,這個流量對於手機來說簡直恐怖,經簡單測試,按照0.03元/K的GPRS網絡費用計算,一局牌居然要消耗1元多的費用(每秒輪詢),實在不可接受。也許我們可以采用流量費包月的資費方式,不過這個話題與技術無關。
  以上問題導致我們選擇了Socket,這意味著我們將沒有一個web環境,很多東西都要靠自己去實現:線程管理、客戶狀態監控、對象池、控制臺……….網絡部分打算采用Java NIO來實現,這是一種新的網絡監聽方式,基於事件的異步通信,可以提高性能。每個客戶端連接之後,會有一個獨立的SocketChannel與它通信,這個SocketChannel會在用戶的整個生存周期中存在。用戶如果斷開連接,服務器會得到-1,並且會拋出Connection reset異常,通過捕獲這兩個特征,可以在用戶意外斷開連接後清理相關的資源。由於NIO是異步通信的,所以沒有復雜的線程管理。

二、通信協議

這個項目並沒有復雜的通信指令,命令數量很有限,但是還是有個關鍵問題需要關註:流量。為了盡量減小流量,我們使用字節代替字符串來保存系統指令,這樣可以使流量減少一半,比如使用一個字節來保存一張撲克牌,字節高位表示花色,字節低位表示數字,如果0代表黑桃,那麽黑桃三就應該是0x03,這個需要靠位操作來實現:

  int m=0;    int n=3;    byte card=(byte)(m)<<4)|((byte)n; //m左移四位,然後與n左或操作 123123

遊戲中需要傳遞用戶的積分,這是一個大整數,使用四個字節來保存比較保險,將整數轉換為四個字節的操作如下:

  package org.bromon.games;       public static byte[] translateLong(long mark)  {        byte[] b = new byte[4];        for (int i = 0; i < 4; i++) {            b[i] = (byte) (mark >>> (24 - i * 8));        }     }1234567812345678

三、數據庫連接池

  
由於沒有一個web環境,所以我們需要自己實現一個數據庫連接池,apache有一個項目叫做commons DBCP,這是一個基於apache自己的對象池(apache commons pool)實現的數據庫連接池,我們可以直接拿來使用,apache的軟件未必是的,但是極大可能比我們自己寫的要好。Commons DBCP需要三個.jar:commons-collections-3.1.jar、commons-dbcp-1.2.1.jar、commons-pool-1.2.jar這三個文件都可以在apache – Jakarta – commons項目下下載,加入到工程中即可

棋牌高防服務器架設教程