天堂2使用國外開源遊戲引擎L2JGameServer作爲服務端遊戲引擎,最近幾天看了一下其源碼,在此分享個人的經驗。其主類爲L2LoginServer:
我們就從它的構造函數開始吧:
//讀取日誌配置文件,配置日誌
InputStream is = null;
try
{
is = new FileInputStream(new File(LOG_NAME));
LogManager.getLogManager().readConfiguration(is);
is.close();
}
catch (IOException e)
{
e.printStackTrace();
}
//讀取其他遊戲配置信息,如服務器災難預防配置,數據庫連接信息等,遊戲技能等
Config.load();
//初始化mysql數據庫連接
try
{
L2DatabaseFactory.getInstance();
}
catch (SQLException e)
{
_log.log(Level.SEVERE, "FATAL: Failed initializing database. Reason: " + e.getMessage(), e);
System.exit(1);
}
這個一看就知道,我就不用說了:
try
{
LoginController.load();
}
catch (GeneralSecurityException e)
{
_log.log(Level.SEVERE, "FATAL: Failed initializing LoginController. Reason: " + e.getMessage(), e);
System.exit(1);
}
/**生成RSA加密解密密鑰在通信過程使用
:生成密鑰對,發送信息之前加密,收到信息時候解密
private LoginController() throws GeneralSecurityException
{
_log.info("Loading LoginController...");
_hackProtection = new FastMap<InetAddress, FailedLoginAttempt>();
_keyPairs = new ScrambledKeyPair[10];
KeyPairGenerator keygen = null;
keygen = KeyPairGenerator.getInstance("RSA");
RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024, RSAKeyGenParameterSpec.F4);
keygen.initialize(spec);
//generate the initial set of keys
for (int i = 0; i < 10; i++)
{
_keyPairs[i] = new ScrambledKeyPair(keygen.generateKeyPair());
}
_log.info("Cached 10 KeyPairs for RSA communication");
testCipher((RSAPrivateKey) _keyPairs[0]._pair.getPrivate());
// Store keys for blowfish communication
generateBlowFishKeys();
_purge = new PurgeThread();
_purge.setDaemon(true);
_purge.start();
}
try
{
GameServerTable.load();
}
catch (GeneralSecurityException e)
{
_log.log(Level.SEVERE, "FATAL: Failed to load GameServerTable. Reason: " + e.getMessage(), e);
System.exit(1);
}
//讀取服務器信息以及生成RSA密鑰
public GameServerTable() throws SQLException, NoSuchAlgorithmException, InvalidAlgorithmParameterException
{
loadServerNames();
_log.info("Loaded " + _serverNames.size() + " server names");
loadRegisteredGameServers();
_log.info("Loaded " + _gameServerTable.size() + " registered Game Servers");
loadRSAKeys();
_log.info("Cached " + _keyPairs.length + " RSA keys for Game Server communication.");
}
//服務器收到信息時候使用私鑰解密,發送數據時候私鑰加密
//客戶端使用公鑰解密收到數據,使用公鑰加密要發送數據
private void loadRSAKeys() throws NoSuchAlgorithmException, InvalidAlgorithmParameterException
{
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(512, RSAKeyGenParameterSpec.F4);
keyGen.initialize(spec);
//生成10個KeyPair,發送數據時候隨機選擇一個私鑰加密
_keyPairs = new KeyPair[KEYS_SIZE];
for (int i = 0; i < KEYS_SIZE; i++)
{
_keyPairs[i] = keyGen.genKeyPair();
}
}
//加載配置的禁止訪問IP
loadBanFile();