2017-09-01 77 views
0

被處理室和用戶在隊列中,單獨運行的線程來接2名玩家客戶端發起搜索請求Smartfoxserver2x處理響應同步

後,下面是我真的很concered約而不太瞭解情況wheather與否我在正確的道路

  1. 可以說玩家A和玩家B發送搜索請求Lobby_1房間。 這兩個User對象都被添加到已經映射到Room(Looby_1)的的ConcurrentLinkedQueue中,因此條件「if( queueSize> = 2)」滿足並且它即將調用onSearchSuccess 發送播放器A和播放器B的遊戲對象作爲參數。由於 這是獨立的線程一直在同時運行,可以說 玩家A在此函數調用前退出/斷開 「lobby.onSearchSuccess(player1,player2);」因爲玩家A 在執行onSearchSuccess on Lobby之前發生斷開連接, 玩家A收到搜索成功並等待遊戲永遠開始 。如果onSearchSuccess執行第一,然後斷開,我 可以讓玩家A知道,球員B斷開

  2. 是增加房和用戶對象集合對象和處理 他們一個單獨的線程中建議?這樣做有沒有問題 ?

我希望我做了清楚我的問題。

如何解決這個問題。我不認爲在多人遊戲中引入同步方式不正確

public void run() { 
     if(!isRunning()) { 
      setRunning(true); 
     } 
     while(isRunning()) { 
      for(Map.Entry<Room, ConcurrentLinkedQueue<User>> entry : LOBBY_MAP.entrySet()) { 
       Room room = entry.getKey(); 
       ConcurrentLinkedQueue<User> queue = entry.getValue(); 
       //check queue size 
       int queueSize = queue.size(); 
       //minimum queue size must be 2 or greater than 2 
       if (queueSize >= 2) { 
        logger.debug("QUEUE SIZE: " + queueSize); 
        User player1 = queue.poll(); 
        User player2 = queue.poll(); 
        //check if both players are not null 
        if(player1 != null && player2 != null) { 
         Lobby lobby = (Lobby) room.getExtension(); 
         lobby.onSearchSuccess(player1, player2);       
        } 
       } 
      } 

     } 
    } 


public class UserDisconnectHandler extends BaseServerEventHandler { 

    public void handleServerEvent(ISFSEvent isfse) throws SFSException { 
     if(isfse.getType() == SFSEventType.USER_DISCONNECT) { 
      User user = (User) isfse.getParameter(SFSEventParam.USER); 
      List<Room> rooms = (List<Room>) isfse.getParameter(SFSEventParam.JOINED_ROOMS);    
      if(rooms != null) { 
       for(Room room : rooms) { 
        if(!room.isGame()) { 
         SearchWorker.getInstance().removeUser(room, user); 
      //handle users qualified after search success 
        } 
       } 
      } 
     }  
    } 

} 

回答

0

爲什麼你在使用踏板? 我用請求做了這件事。我的意思是,當玩家A請求時,服務器中的監聽者將他添加到房間FindMatch中,然後當玩家B請求時,您也將他添加到該房間。但是,您必須在每個請求中檢查房間大小,並確定大小是否爲2,然後將其從FindMatch房間中移出並加入遊戲室。 這就是我爲我的遊戲所做的事情,通過這種方式,您甚至可以爲超過2名玩家創建遊戲空間。