2012-01-19 25 views
0


我正在解決一個問題,我有點被卡住了。我將從一些背景開始。
我正在編程記憶遊戲(例如它是這樣的東西http://www.mathsisfun.com/games/memory/index.html)。它應該是客戶端服務器應用程序。
客戶端 - 在java中
服務器 - 在C

情況1個服務器,N個客戶端

服務器將有一個遊戲列表 - 在每場比賽的兩名選手
每場比賽將分別在ONW工藝處理 - 我用叉子
actionListener使用內存遊戲客戶端 - 服務器應用程序

客戶端的Java Swing形式aplication - 和represets球員
客戶端和服務器兩種方法只comunicate

(相應功能。)

客戶端 - 無效sendMessageToServer(字符串消息),字符串recieveMessageFromerver()
服務器 - recieveMessage(void *的vptr的,爲size_t MAXLEN,
INT socketfileDesc),詮釋sendMessageToClient(字符*味精,INT插座)
簡單 - 我只是發送字符串消息從服務器到客戶端,客戶端到服務器我都是編碼動作

現在我的問題: 爲了更容易測試客戶端一個服務器也在java中,我解決問題只有一個遊戲 - 一個服務器,2客戶端(均在java中) 所以我有3個類 Clilent:
- 顯示來自
- 大約有遊戲信息,
- 具有靜態方法CreateAndShowGUI(字符串serverInsanceHandle)=>顯示 - 的形式,使實例客戶
服務器:
- 只是兩個消息 - 收到,發送
之前我提到的 測試:

public class Test { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     final Server server = new Server(); 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       Client.createAndShowGUI(server); 
       Client.createAndShowGUI(server); 

      } 
     });  
    }  
} 

位置:

我的問題是這樣的:
用於簡單的測試我有遊戲4x4卡,這意味着8對
我有數組JButton [] buttonsArray = new JButton [16];在每個按鈕上的ImageIcon與卡的圖片,每個按鈕都添加了actionListenner(privateclass) 在實現ActionListener的方法actionPerformed並在那裏我改變了客戶端的設置 - 我發送消息到服務器和服務器發回我的消息我是什麼應該在客戶端做。 我的問題是,我有兩個客戶端和一臺服務器。 當我在client1中執行操作時,它僅在client1中有效,但我需要以某種方式讓它現在到client2。 我可以有卡片領域什麼應該在服務器上查看,或者我可以有字符串消息領域 - 與編碼的變化,但我現在不怎麼讓client2知道client1做了一些行動。通信必須通過服務器: 就像「你好,我是client1,我按了2號按鈕,所以你client2應該問服務器的變化」,但我不能這樣做。 那麼我該怎麼辦?

注意:它應該是TCP通信的「模擬」,所以我將使用tcp套接字 - 但現在可能不重要。

回答

4

我要承擔有關服務器的兩件事情:

  1. 服務器正在維護的記憶遊戲(即,卡正在翻轉,國家的客戶端發現正確的雙卡,等等。)。我打算把這個叫做GameState對象。
  2. 服務器也保持了獨特的Socket連接到每個客戶端

這聽起來好像你的客戶先更新自己的本地遊戲狀態,然後告訴服務器更新其遊戲狀態。這就是說,我會做如下修改:

  1. 每次客戶要翻轉卡片,或修改遊戲狀態的一些其他動作,都將它發送消息到服務器,告訴它更新其遊戲狀態。
  2. 每當服務器更新其GameState時,讓它將整個GameState發送給所有客戶端。
  3. 設計您的客戶端只顯示它從服務器收到的GameState。

這樣,您的服務器就可以控制主GameState,您的客戶端更像是GameState的「觀察者」。

+0

除了每次發生更新時發送整個遊戲狀態,您可以在第一次連接時向客戶端發送整個遊戲狀態,然後只發送消息更新其自己的遊戲狀態視圖。但是像Ben說的那樣,你需要在服務器上處理新遊戲狀態和玩家動作的所有實際處理。這也是遊戲的一項安全措施,通過向服務器發送非法動作來防止人們作弊。 – aoi222

+0

我像Ben寫的一樣做。我發送服務器消息與行動和服務器發送回客戶端消息應該客戶端應該改變。 但我不知道如何發送消息給所有的客戶 - **這實際上是我的問題**。但是像觀察者模式可能是我的解決方案。因此,我添加到服務器端的觀察者列表,如果服務器獲取有關更改的消息(更改前的響應操作),則服務器通知觀察者列表中的所有觀察者=發送包含列表中所有客戶端的更改的消息。謝謝我只是忘記了觀察者模式存在:D – user1097772

+0

啊,錯過了你說的實際發送消息的部分。這比這更復雜一點,但我通常在ObjectInputStream和ObjectOutputStream實例中包裝客戶端到服務器和服務器到客戶端的Socket連接的InputStream和OutputStream。然後,只要你的GameState對象(或者你選擇實現的任何消息對象)實現了Serializable,你可以將這些對象直接穿過套接字寫到遠端。有點酷:) – CodeBlind

相關問題