gameroommanager.java

来自「是一款国外的网络游戏平台的源码*不是类似浩方那种虚拟局域网技术」· Java 代码 · 共 220 行

JAVA
220
字号
/*
 * Created on Mar 12, 2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package org.GTADS.usermanager;

import java.io.IOException;
import java.net.Socket;
import java.util.Vector;

import org.GTADS.messenger.MessageAdapter;
import org.GTADS.protocol.ErrorManager;
import org.GTADS.protocol.MetaData;
import org.GTADS.server.ServerCacheHandler;

/**
 * @author Administrator
 *
 * GameroomManager will manage the additions and removals
 * of gameroom objects on the server and make updates available
 * to all users on the server
 */
public class GameroomManager {
	public static GameroomManager instance;
	public static int REMOVE_GAMEROOM = 0;
	public static int ADD_GAMEROOM = 1;
	
	public static GameroomManager getInstance(){
		if (instance == null){
			instance = new GameroomManager();
		}
		return instance;
	}
	
	public static void clearInstance(){
		if (instance != null){
			instance = null;
		}
	}
	
	public void updateGameroomList(GameRoom newGameroom, int state){
		MetaData updateListHeader = new MetaData(MetaData.FROM_SERVER, MetaData.GAME,
				state + "");
		String gameroomData = newGameroom.getChatroomName() + "," + newGameroom.getChatroomCreator() + "," +
				newGameroom.getGameType() + "," + newGameroom.getNumPlayers() + "/" + newGameroom.getMaxPlayers();
		MessageAdapter.sendToAll(updateListHeader,gameroomData);
	}
	
	public void refreshGameroomList(GameRoom newGameroom, int state, Socket userSocket){
		try{
		MetaData updateListHeader = new MetaData(MetaData.FROM_SERVER, MetaData.GAME,
				state + "");
		String gameroomData = newGameroom.getChatroomName() + "," + newGameroom.getChatroomCreator() + "," +
				newGameroom.getGameType() + "," + newGameroom.getNumPlayers() + "/" + newGameroom.getMaxPlayers();
		MessageAdapter.sendData(null,userSocket,updateListHeader,gameroomData);
		} catch (IOException ioe){
		}
	}
	
	public void joinGameroom(String userName, String gameRoom){
		GameRoom g = (GameRoom)ServerCacheHandler.gameroomNameCache.get(gameRoom);
		if (g.getMaxPlayers() != g.getNumPlayers()){
			if (!g.getListOfUsers().contains(userName))
				g.addUserToChatroom(userName);
			ServerCacheHandler.userGameroomCache.put(userName,gameRoom);
			try {
				MetaData joinroomHeader = new MetaData(gameRoom,MetaData.GAME,MetaData.JOIN_CHATROOM);
				sendDataToGameroom(gameRoom,joinroomHeader,userName);
			} catch (IOException ioe){
			}
			sendUserGreeting(userName, gameRoom);
			updateGameroomList(g,ADD_GAMEROOM);
		}
		else {
			try {
			ErrorManager.sendErrorToClient((Socket)ServerCacheHandler.userSocketCache.get(userName),ErrorManager.CHATROOM_FULL);
			} catch (IOException ioe){
				
			}
		}
	}
	
	public void createGameroom(String userName, String settings){
		String[] gameroomSettings = new String[3];
		// [0] = Name
		// [1] = Game type
		// [2] = Max Players
		// [3] = Binded IP
		if (settings.split(",").length >= 3){
			gameroomSettings = settings.split(",");
			Integer maxPlayers = Integer.valueOf(gameroomSettings[2]);
			// Check if gameroom exists
			if (!ServerCacheHandler.gameroomNameCache.containsKey(gameroomSettings[0])){
				if (ServerCacheHandler.userGameroomCache.containsKey(userName)){
					leaveGameroom(userName, 
							(String)ServerCacheHandler.userGameroomCache.get(userName));
				}
				
				GameRoom newGameroom = new GameRoom(new User(userName), gameroomSettings[0],
						gameroomSettings[1], maxPlayers.intValue());
				if (gameroomSettings.length > 3){ // Extra parameter for binding IP
					newGameroom.setBindIP(gameroomSettings[3]);
				}
				ServerCacheHandler.gameroomNameCache.put(gameroomSettings[0],newGameroom);
				joinGameroom(userName, gameroomSettings[0]);
				sendStatus(userName, gameroomSettings[0], gameroomSettings[1], true);
			}
		}
	}
	
	private void sendStatus(String userName, String gameroomName, String gameType, boolean isJoin){
		Vector listofUserChatrooms = (Vector)ServerCacheHandler.userChatroomCache.get(userName);
		String chatroom = new String();
		
		for (int i = 0; i < listofUserChatrooms.size();i++){
			chatroom = (String)listofUserChatrooms.get(i);
			MetaData gameroomHeader = new MetaData(MetaData.FROM_SERVER, MetaData.CHATROOM, MetaData.NO_SESSION_NAME);
			try {
			MessageAdapter.sendToChatroom(gameroomHeader, chatroom, isJoin ? 
					userName + " has created a new " + gameType + " game: " + gameroomName : userName + " has destroyed their game");
			} catch (IOException ioe){}
		}
	}
	
	public void leaveGameroom(String userName, String gameRoom){
		try {
			GameRoom g = (GameRoom)ServerCacheHandler.gameroomNameCache.get(gameRoom);
			if (g.getNumPlayers() > 0){
				MetaData partGameroomHeader = new MetaData(gameRoom,MetaData.GAME,MetaData.PART_CHATROOM);
				sendDataToGameroom(gameRoom,partGameroomHeader,userName);
				g.removeUserFromChatroom(userName);
				ServerCacheHandler.userGameroomCache.remove(userName);
				MetaData partroomHeader = new MetaData(gameRoom, MetaData.GAME,MetaData.PART_CHATROOM);
				this.sendDataToGameroom(gameRoom,partroomHeader,userName);
			}
			if (g.getNumPlayers() == 0 || g.getChatroomCreator().equals(userName)){
				disposeGameroom(userName, g);
				updateGameroomList(g,REMOVE_GAMEROOM);
				sendStatus(userName, null,null, false);
			}
			else{
				updateGameroomList(g,ADD_GAMEROOM);
			}
		} catch (IOException ioe){
			return;
		}
	}
	
	public void sendUserGreeting(String userName, String gameRoom){
		try {
			GameRoom g = (GameRoom)ServerCacheHandler.gameroomNameCache.get(gameRoom);
			Socket userSock = (Socket)ServerCacheHandler.userSocketCache.get(userName);
			MetaData greetingHeader = new MetaData(gameRoom,MetaData.GAME,MetaData.GREET);
			MessageAdapter.sendData(null,userSock,greetingHeader,gameRoom);
			
			if (g.getNumPlayers() > 0){
				Vector gameroomList = g.getListOfUsers();
				for (int i = 0; i < gameroomList.size();i++){
					String currentUserInList = (String)gameroomList.get(i);
					if (!currentUserInList.equals(userName)){
						MetaData sendListHeader = new MetaData(gameRoom,MetaData.GAME,MetaData.SEND_LIST);
						MessageAdapter.sendData(null,userSock,sendListHeader,currentUserInList);
					}
				}
			}
			MetaData sendJoinHeader = new MetaData(gameRoom,MetaData.GAME,MetaData.JOIN_CHATROOM);
			sendDataToGameroom(gameRoom,sendJoinHeader,userName);
		} 
		catch (IOException ioe){
			return;
		}
	}
	
	public void sendDataToGameroom(String gameRoom, MetaData header, String message) throws IOException{
		GameRoom g = (GameRoom)ServerCacheHandler.gameroomNameCache.get(gameRoom);
		if (g.getNumPlayers() > 0){
			Vector currentUserInList = g.getListOfUsers();
			for (int i = 0; i < currentUserInList.size(); i++){
				Socket playerSocket = (Socket)ServerCacheHandler.userSocketCache.get(currentUserInList.get(i));
				if (playerSocket == null || playerSocket.isClosed())
					continue;
				MessageAdapter.sendData(null,playerSocket,header,message);
			}
		}
		return;
	}
	public void disposeGameroom(String userName, GameRoom g){
		Vector players = g.getListOfUsers();
		if (g.getNumPlayers() > 0){			
			for (int i = 0; i < players.size(); i++){
				ServerCacheHandler.userGameroomCache.remove((String)players.get(i));
				MetaData disposeHeader = new MetaData(userName, MetaData.GAME, MetaData.DISPOSE_GAMEROOM);
				try {
					MessageAdapter.sendData(null, (Socket)ServerCacheHandler.userSocketCache.get((String)players.get(i)),
							disposeHeader,g.getChatroomName());
				} catch (IOException ioe){
					ioe.printStackTrace();
				}
			}
		}
		ServerCacheHandler.gameroomNameCache.remove(g.getChatroomName());
	}
	
	public void sendAllGames(){
		Vector listOfActiveGames = new Vector(ServerCacheHandler.gameroomNameCache.values());
		for (int i = 0; i < listOfActiveGames.size();i++){
			this.updateGameroomList((GameRoom)listOfActiveGames.get(i),ADD_GAMEROOM);
		}
	}
	
	public void sendAllGamesToUser(Socket userSock){
		Vector listOfActiveGames = new Vector(ServerCacheHandler.gameroomNameCache.values());
		for (int i = 0; i < listOfActiveGames.size();i++){
			this.refreshGameroomList((GameRoom)listOfActiveGames.get(i),ADD_GAMEROOM,userSock);
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?