/* POKER SERVERName: Server.java Purpose: Act as the server for 1 to several poker games Date: 10/11/2000 Written By: Jason Hertzog & Mike Dise Written For: Dr. R. Webster Portions of this code were taken from the book _Java in a Nutshell_ by David Flanagan. Written by David Flanagan. Copyright (c) 1996 O'Reilly & Associates. */ import java.io.*; import java.net.*;import java.util.*; public class ServerManager extends Thread { public final static int DEFAULT_PORT = 8123; public final static boolean VERBOSE = true; public final static boolean PRINT_ERRORS = true; protected int port; protected ServerSocket listen_socket; protected Vector games = new Vector(5,2); protected Vector clients = new Vector(10,2); public ServerManager(int port) { if (port == 0) port = DEFAULT_PORT; this.port = port; try { listen_socket = new ServerSocket(port); } catch (IOException e) { if (PRINT_ERRORS) System.err.println("Exception creating server socket to listen on port " + String.valueOf(port) + ": " + e); System.exit(1); } if (VERBOSE) System.out.println("ServerManager: listening on port " + String.valueOf(port)); Thread g = new Thread(new gameUpdate()); // Poker f = new Poker(); // PokerHand h1 = new PokerHand(new Card('H',1),new Card('S',3),new Card('H',4),new Card('H',2),new Card('H',9)); // PokerHand h2 = new PokerHand(new Card('H',11),new Card('S',2),new Card('C',5),new Card('H',6),new Card('H',10)); //System.out.println(f.determineWinner(h1, h2,0)); //System.out.println(PokerWin.toString(f.getReasonWin())); g.start(); this.start(); } public void run() { try { while(true) { Socket client_socket = listen_socket.accept(); Connection temp = new Connection(client_socket, this); clients.addElement(temp); if (VERBOSE) System.out.println("ServerManager: Recieved connection from " + client_socket.getInetAddress()); } } catch (IOException e) { if (PRINT_ERRORS) System.err.println("Exception while listening for connections: " + e); System.exit(1); } } public void addClient(Socket s, BufferedReader i, PrintWriter o) { Socket client_socket = s; Connection temp = new Connection(client_socket,i,o, this); clients.addElement(temp); if (VERBOSE) System.out.println("ServerManager: Added connection from " + client_socket.getInetAddress()); } public static void main(String[] args) { int port = 0; if (args.length == 1) { try { port = Integer.parseInt(args[0]); } catch (NumberFormatException e) { port = 0; } } new ServerManager(port); } class gameUpdate implements Runnable { public void run(){ while (true) { try { sleep(30000); } catch (InterruptedException ie) {} broadcast("REFRESH_GAMES"); for (int j=0; j < games.size(); j++) { GameServer temp = (GameServer)games.elementAt(j); if (temp.isGameStarted() && temp.getPlayerNames().equals("")) { //Don't Show Game } else { broadcast(getNewGameString(temp)); } } } } } class Connection extends Thread { private Socket client; public BufferedReader in; public PrintWriter out; private int game2join; private ServerManager serverManager; private String user_name = ""; private String avatar = ""; public Connection(Socket s, ServerManager ss) { client = s; serverManager = ss; try { in = new BufferedReader(new InputStreamReader(s.getInputStream())); out = new PrintWriter(s.getOutputStream()); if (games.size() > 0) { for (int j=0; j < games.size(); j++) { GameServer temp = (GameServer)games.elementAt(j); if (temp.isGameStarted() && temp.getPlayerNames().equals("")) { //Get Rid of Game //games.removeElementAt(j); } else { writeSocket(out, getNewGameString(temp)); } } } else { writeSocket(out,"No Games Available."); } } catch (IOException e){ } this.start(); } public Connection(Socket s, BufferedReader i, PrintWriter o, ServerManager ss) { client = s; serverManager = ss; in = i; out = o; if (games.size() > 0) { for (int j=0; j < games.size(); j++) { GameServer temp = (GameServer)games.elementAt(j); writeSocket(out,getNewGameString(temp)); } } else { writeSocket(out,"NO_GAMES"); } this.start(); } public void run() { String line; int len; boolean isDone = false; StringTokenizer st; String testString; try { while(!isDone){ line = in.readLine(); if (VERBOSE) System.out.println("ServerManager: Received " + line); if (line == null) break; st = new StringTokenizer(line, "|", false); testString = st.nextToken().toString(); if (testString.equals("NEW_GAME")){ int gameId = games.size(); if (VERBOSE) System.out.println("ServerManager: Creating game " + gameId); games.addElement(new GameServer(gameId, serverManager,st.nextToken().toString(),st.nextToken().toString())); GameServer temp = (GameServer)games.lastElement(); broadcast(getNewGameString(temp)); } else if (testString.equals("REFRESH_GAMELIST")){ for (int j=0; j < games.size(); j++) { GameServer temp = (GameServer)games.elementAt(j); if (temp.isGameStarted() && temp.getPlayerNames().equals("")) { } else { writeSocket(this.out,getNewGameString(temp)); } } } else if (testString.equals("JOIN_GAME")){ game2join = Integer.parseInt(st.nextToken().toString()); writeSocket(this.out,"GOT_GAME_REQUEST"); if (VERBOSE) System.out.println("ServerManager: Waiting for READY from client: " + client.getLocalAddress()); } else if (testString.equals("READY")){ if (VERBOSE) System.out.println("ServerManager: Adding " + client.getInetAddress() + " to game " + game2join); writeSocket(this.out,"GOT_GAME_REQUEST"); GameServer game = (GameServer)games.elementAt(game2join); if (game.addPlayer(client, in, out,user_name, avatar)) { isDone = true; if (VERBOSE) System.out.println("ServerManager: " + client.getInetAddress() + " successfully added to game " + game2join); clients.removeElement(this); } else { if (VERBOSE) System.out.println("ServerManager: WARNING! " + client.getInetAddress() + " UNsuccessfully added to game " + game2join); } } else if (testString.equals("NAME")){ user_name = st.nextToken().toString(); } else if (testString.equals("AVATAR")){ avatar = st.nextToken().toString(); } else if (testString.equals("KILL")){ System.exit(0); } } } catch (IOException e) {if (PRINT_ERRORS) System.out.println(e.toString());} } } public void broadcast (String t) { for (int j=0; j < clients.size(); j++) { Connection temp = (Connection)clients.elementAt(j); writeSocket(temp.out,t); } } private void writeSocket (PrintWriter p, String t) { p.println(t); p.flush(); } private String getNewGameString(GameServer temp) { return "NEW_GAME|" + temp.getGameId() + "|" + temp.getGameName() + "|" + temp.getPlayerNames() + " |" + getBinVal(temp.getPwdReq()) + "|" + getBinVal(temp.isGameStarted()) + "|" + getBinVal(temp.isGameFull()) + "|" + temp.getPwd() + " "; } private String getBinVal(boolean b) { if (b){ return "1"; } else { return "0"; } }}