java - Game with server and multiple client, make sure only one game object is created -
i'm trying write poker server , client program, create game in server class , client class takes output , displays them. however, when ever this, there seem 2 game objects created, first player gets input consistent object shown in console, second player displays cards not shown in sysout method, , can not seem find created second game object.
server class:
import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; import java.io.printwriter; import java.net.inetaddress; import java.net.serversocket; import java.net.socket; import java.net.unknownhostexception; import java.util.arraylist; import java.util.hashset; public class pokerserver { /** * port server listens on. */ private static final int port = 9050; // keeps track of names private static arraylist<string> names = new arraylist<string>(); // broadcast messages private static arraylist<printwriter> writers = new arraylist<printwriter>(); private boolean bothplayersconnected = false; /** * appplication main method, listens on port , spawns * handler threads. */ public static void main(string[] args) throws exception { system.out.println("the poker server running."); serversocket listener = new serversocket(port); try { while (true) { new gamethread(listener.accept()).start(); } } { listener.close(); } } private static class gamethread extends thread { private string name; private socket socket; private bufferedreader in; private printwriter out; private game game; public gamethread(socket socket) { this.socket = socket; } /** * services thread's client repeatedly requesting screen name * until unique 1 has been submitted, acknowledges name , * registers output stream client in global set, * repeatedly gets inputs , broadcasts them. */ public void run() { try { system.out.println("get part"); // create character streams socket. in = new bufferedreader(new inputstreamreader(socket.getinputstream())); out = new printwriter(socket.getoutputstream(), true); // name of player out.println("submitname"); name = in.readline(); names.add(name); while(names.size()<2){ out.println("message waiting opponent connect"); } // successful name has been chosen, add // socket's print writer set of writers // client can receive broadcast messages. // out.println("nameaccepted"); // writers.add(out); game = new game(names.get(0), names.get(1), 1000); game.dealtoplayers(); out.println(names.get(0) + game.getplayer1().gethand()[0].transferstr()); out.println(names.get(0) + game.getplayer1().gethand()[1].transferstr()); out.println(names.get(1) + game.getplayer2().gethand()[0].transferstr()); out.println(names.get(1) + game.getplayer2().gethand()[1].transferstr()); // accept messages client , broadcast them. // ignore other clients cannot broadcasted to. while (true) { string input = in.readline(); if (input == null) { return; } else if (input.startswith(names.get(0))) { } (printwriter writer : writers) { writer.println("message " + name + ": " + input); } } } catch (ioexception e) { system.out.println(e); } { // client going down! remove name , print // writer sets, , close socket. if (name != null) { names.remove(name); } if (out != null) { writers.remove(out); } try { socket.close(); } catch (ioexception e) { } } } } }
client class
import java.awt.borderlayout; import java.awt.color; import java.awt.dimension; import java.awt.gridlayout; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; import java.io.printwriter; import java.net.inetaddress; import java.net.socket; import java.net.unknownhostexception; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.joptionpane; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.jtextarea; import javax.swing.jtextfield; public class pokerclient { bufferedreader in; printwriter out; string playername = "poker"; jframe frame = new jframe(playername); jpanel playerhandpanel, controlpanel, bottompanel, toppanel, messageboard; jbutton check, fold; jtextfield textfield = new jtextfield(10); jlabel firstline = new jlabel(""); string serveraddress = "localhost"; card playerhand1, playerhand2; public pokerclient() { // layout gui frame.setsize(1100, 700); frame.setresizable(true); frame.setdefaultcloseoperation(jframe.exit_on_close); playerhandpanel = new jpanel(new gridlayout(1, 0)); playerhandpanel.setpreferredsize(new dimension(600, 300)); playerhandpanel.setvisible(true); toppanel = new jpanel(new gridlayout(1, 0)); toppanel.setpreferredsize(new dimension(900, 300)); toppanel.setvisible(true); messageboard = new jpanel(new gridlayout(0, 1)); messageboard.add(firstline); controlpanel = new jpanel(); controlpanel.setpreferredsize(new dimension(600, 40)); controlpanel.setvisible(true); toppanel.add(messageboard); check = new jbutton("check"); check.addactionlistener(new actionlistener() { public void actionperformed(actionevent e) { out.println(playername+"check"); } }); fold = new jbutton("fold"); fold.addactionlistener(new actionlistener() { public void actionperformed(actionevent e) { out.println(playername+"fold"); } }); textfield.addactionlistener(new actionlistener() { public void actionperformed(actionevent e) { if(isint(textfield.gettext())){ out.println(textfield.gettext()); textfield.settext(""); } else{ jframe frame = new jframe("not number"); frame.setsize(600, 70); frame.setlocation(400, 250); frame.setresizable(false); jlabel label = new jlabel("you must enter number in order raise"); frame.add(label); frame.setvisible(true); frame.tofront(); frame.repaint(); textfield.settext(""); } } }); controlpanel.add(check); controlpanel.add(fold); controlpanel.add(new jlabel(" raise:")); controlpanel.add(textfield); bottompanel = new jpanel(); bottompanel.add(controlpanel, borderlayout.south); bottompanel.add(playerhandpanel, borderlayout.north); frame.add(toppanel, borderlayout.north); frame.add(bottompanel, borderlayout.south); //frame.add(firstline, "south"); frame.setvisible(true); } private static boolean isint(string s) { try { int = integer.parseint(s); return true; } catch(numberformatexception er) { return false; } } /** * prompt , return desired screen name. */ private string getname() { return joptionpane.showinputdialog( frame, "choose screen name:", "screen name selection", joptionpane.plain_message); } private card constructcard(string line){ int seperator = line.indexof('/'); int cardnum = integer.parseint(line.substring(0, seperator)); card card; if(line.substring(seperator+1).startswith("s")){ card = new card(cardnum, suit.spade); } else if(line.substring(seperator+1).startswith("c")){ card = new card(cardnum, suit.club); } else if(line.substring(seperator+1).startswith("d")){ card = new card(cardnum, suit.diamond); } else{ card = new card(cardnum, suit.heart); } system.out.println(card.tostring()); return card; } /** * connects server enters processing loop. */ private void run() throws ioexception { socket socket = new socket(serveraddress, 9050); in = new bufferedreader(new inputstreamreader( socket.getinputstream())); out = new printwriter(socket.getoutputstream(), true); // process messages server, according protocol. while (true) { string line = in.readline(); system.out.println(line); if (line.startswith("submitname")) { string name = getname(); playername = name; out.println(name); frame.settitle(playername); } else if (line.startswith(playername)) { playerhandpanel.add(new cardcomponent(constructcard(line.substring(playername.length())))); playerhandpanel.revalidate(); playerhandpanel.repaint(); } else if(line.startswith("card")){ toppanel.add(new cardcomponent(constructcard(line.substring(4)))); toppanel.revalidate(); toppanel.repaint(); } else if(line.startswith("message")){ firstline.settext(line.substring(7)); } } } public static void main(string[] args) throws exception { pokerclient client = new pokerclient(); client.frame.setdefaultcloseoperation(jframe.exit_on_close); client.frame.setvisible(true); client.run(); } }
Comments
Post a Comment