天堂2遊戲登陸服務器源碼分析

     天堂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();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章