2013-11-10 43 views
0

我不確定在哪裏以及如何開始,但我有幾個關於服務器和客戶端如何彼此協作的問題。我對Java和任何編程都很陌生,所以我非常無知。這些問題是關於多人遊戲,如Minecraft,WoW等。服務器/客戶端操作如何工作?

所以讓我開始吧。

  1. 我想知道的第一件事是,交互如何起作用?我讀過關於這個的文檔,它告訴我使用Socket,然後使用PrintWriter和BufferedReader進行輸入和輸出。如果有人足夠聰明地反編譯客戶端,然後編輯發送的數據以改變位置值,並且當服務器接收到數據時,它會將播放器重新定位到他們的任何位置設置他們的新位置。我怎樣才能防止這一點?

  2. 服務器/客戶端交互的真實/最佳方式是什麼?我是否使用Socket併爲其寫入東西以供客戶端接收,或者我應該使用DatagramSocket和DatagramPacket?還是有另一種方式?

我想從客戶端分離的服務器,就像幾乎所有其他多人遊戲:你有啓動服務器上的文件,則客戶端可以連接到。

在此先感謝,我很想知道這個概念。

回答

0

1.這篇文章過於寬泛,無法以本網站可以接受的形式合理回答。我建議你繼續閱讀教程,並試圖編寫小型測試程序,直到你想到它

2.是很多「欺騙客戶」做你正在描述的東西。停止它的唯一方法是在服務器端,它必須驗證來自客戶端的信息(如果玩家的最高速度爲x,則檢查是否newLocation > oldLocation + x以及是否將玩家踢出服務器以進行作弊)。然而,問題在於你檢查的CPU時間越多,檢查得越多。您需要在作弊保護與服務器性能之間取得平衡

3.您需要開發一個「消息協議」,套接字只是字節流。當你在通信的另一端時,你無法分辨「消息」停止的地方和下一個開始,除非雙方都同意標準。

一個常見的消息協議是在你發送一條消息之前,你發送一條消息byte什麼樣的消息是你要發送的消息。然後,您的代碼將看起來像這樣(對不起,C#我知道你說你只知道的Java)

private void ReadIncomingClientData(NetworkStream clientStream) 
{ 
    while((messageLength = clientStream.ReadByte()) != -1) 
    { 
     switch(message[0]) 
     { 
      case 0: 
       HandlePlayerMovement(clientStream); 
      case 1: 
       HandlePlayerChat(clientStream); 
      case 2: 
       HandlePlayerBeginLogoff(); 
      default: 
       throw new InvalidDataException(); 
     } 
    } 
} 

然後在每個那些功能,他們每個知道多少字節應該如何來下在消息中。你提到了我的世界,here is the message protocol it uses,所以你可以看到更復雜的一個看起來像什麼。

+0

感謝您提供豐富的答案。我會繼續看網絡教程和whatnot。 – user2975166

相關問題