// Processed by NMI's Java Code Viewer 4.8.2 © 1997-2000 B. Lemaire // Website: http://njcv.htmlplanet.com E-mail: info@njcv.htmlplanet.com // Copy registered to Evaluation Copy // Source File Name: Client.java import java.awt.*; import java.io.*; import java.net.Socket; import java.net.UnknownHostException; import java.util.Vector; public class Client extends Thread { Frame target; int port; String host; String nick; public Socket clientSocket; public DataOutputStream os; public DataInputStream is; public boolean gameDataRecievedOk; public boolean needToClose; int intIn; int intOut; String lineIn; public Client(Frame frame) { gameDataRecievedOk = true; needToClose = false; target = frame; port = ClientData.port; host = ClientData.host; nick = ClientData.nick; } public void run() { boolean flag = false; while(!ClientData.timeOutReached && (clientSocket == null || os == null || is == null)) { flag = false; try { Thread.sleep(5L); clientSocket = new Socket(host, port); is = new DataInputStream(clientSocket.getInputStream()); os = new DataOutputStream(clientSocket.getOutputStream()); } catch(InterruptedException _ex) { closeClient(); } catch(UnknownHostException _ex) { flag = true; } catch(IOException _ex) { } } if(flag) { ChatArea.addText(">>> Trying to connect to unknown host: " + host, 141); closeClient(); } if(clientSocket == null || is == null || os == null) { ChatArea.addText(">>> Failed to connect to server, exiting ...", 141); closeClient(); } target.handleEvent(new Event(this, 1001, Integer.toString(154))); try { os.writeInt(154); } catch(IOException _ex) { closeClient(); } intIn = readInt(); if(intIn != 115) { if(intIn == 130) ChatArea.addText(">>> " + C.MAX_NUM_OF_PLAYERS + " players already connected. Disconecting ...", 141); if(intIn == 125) ChatArea.addText(">>> The game has already begun. Disconnecting ...", 141); closeClient(); } ClientData.amI_Connected = true; ClientData.myNumber = readInt(); if(!sendNick(nick)) closeClient(); while(ClientData.amI_Connected) { int i; for(i = 0; ClientData.amI_Connected && i == 0 && ClientData.turnStatus == 166 && !needToClose;) { try { i = is.available(); } catch(IOException _ex) { closeClient(); } try { Thread.sleep(5L); } catch(InterruptedException _ex) { closeClient(); } } if(needToClose) closeClient(); switch(ClientData.turnStatus) { case 162: ClientData.turnStatus = 166; ClientData.myTurn = false; try { os.writeInt(162); } catch(IOException _ex) { closeClient(); } readBankLetters(); break; case 163: ClientData.turnStatus = 166; ClientData.myTurn = false; try { os.writeInt(163); } catch(IOException _ex) { closeClient(); } break; case 164: ClientData.waitingForAnswer = true; try { os.writeInt(164); for(int j = 0; j < 15; j++) { for(int k = 0; k < 15; k++) if(ClientData.canBeDragged[j][k]) { os.writeInt(j); os.writeInt(k); os.writeChar(ClientData.boardLetters[j][k]); } } os.writeInt(126); } catch(IOException _ex) { closeClient(); } ClientData.turnStatus = 166; break; } if(i != 0) label0: switch(readInt()) { default: break; case 112: // 'p' ChatArea.addText(readLine(), 142); break; case 116: // 't' readGameData(); break; case 190: intIn = readInt(); if(intIn == ClientData.myNumber) ChatArea.addText(">>> You have just been kicked from the server !!!", 141); else ChatArea.addText(">>> " + ClientData.nicks[intIn] + " has just been kicked!!!", 141); break; case 114: // 'r' boolean flag1 = false; try { flag1 = is.readBoolean(); } catch(IOException _ex) { closeClient(); } intIn = readInt(); for(int l = 0; l < C.MAX_NUM_OF_PLAYERS; l++) { if(ClientData.playersOrder[l] != intIn) continue; ClientData.orderOfDisconnectedPlayer = l; break; } ClientData.clientsCurrentlyConnected = readInt(); if(ClientData.nicks[intIn] != null) ChatArea.addText(">>> " + ClientData.nicks[intIn] + " has disconnected ", 142); readGameData(); if(!ClientData.gameInProgress) break; if(flag1) target.handleEvent(new Event(this, 1001, Integer.toString(170))); else target.handleEvent(new Event(this, 1001, Integer.toString(171))); break; case 127: // '\177' ClientData.gameInProgress = true; ChatArea.addText(">>> Server has started the game", 142); for(int i1 = 0; i1 < ClientData.clientsCurrentlyConnected; i1++) ClientData.playersOrder[i1] = readInt(); for(int j1 = 0; j1 < 15; j1++) { for(int j2 = 0; j2 < 15; j2++) try { ClientData.boardLetters[j1][j2] = is.readChar(); } catch(IOException _ex) { closeClient(); } } for(int k1 = 0; k1 < C.MAX_NUM_OF_PLAYERS; k1++) try { ClientData.playersScores[k1] = is.readInt(); } catch(IOException _ex) { closeClient(); } readBankLetters(); target.handleEvent(new Event(this, 1001, Integer.toString(127))); break; case 169: ClientData.whoseTurn = readInt(); ChatArea.addText(">>> Your turn!", 142); ClientData.myTurn = true; target.handleEvent(new Event(this, 1001, Integer.toString(167))); break; case 167: ClientData.whoseTurn = readInt(); ChatArea.addText(">>> " + ClientData.nicks[ClientData.whoseTurn] + " has started the turn", 142); target.handleEvent(new Event(this, 1001, Integer.toString(167))); break; case 168: switch(readInt()) { default: break; case 162: ChatArea.addText(">>> " + ClientData.nicks[ClientData.whoseTurn] + " has passed the turn", 142); break label0; case 163: if(ClientData.myTurn) ChatArea.addText(">>> Sorry " + ClientData.nick + ", your time is up!", 142); else ChatArea.addText(">>> " + ClientData.nicks[ClientData.whoseTurn] + " hasn't finished his turn in time", 142); break label0; case 161: ClientData.waitingForAnswer = false; ChatArea.addText(">>> You made an illegal move!", 141); break label0; case 160: ClientData.waitingForAnswer = false; ClientData.words.removeAllElements(); try { for(int l1 = 0; l1 < 15; l1++) { for(int k2 = 0; k2 < 15; k2++) if((ClientData.boardLetters[l1][k2] = is.readChar()) != 0) ClientData.canBeDragged[l1][k2] = true; } for(int l2 = 0; (intIn = readInt()) != 126; l2++) ClientData.words.addElement(readLineWithLength(intIn)); ClientData.turnScore = readInt(); ClientData.playersScores[ClientData.whoseTurn] += ClientData.turnScore; } catch(IOException _ex) { closeClient(); } if(ClientData.myTurn) { for(int i2 = 0; i2 < 7; i2++) try { os.writeChar(ClientData.bankLetters[i2]); } catch(IOException _ex) { closeClient(); } for(int i3 = 0; i3 < 7; i3++) try { ClientData.bankLetters[i3] = is.readChar(); } catch(IOException _ex) { closeClient(); } } ClientData.myTurn = false; target.handleEvent(new Event(this, 1001, Integer.toString(160))); break; } break; case 172: ClientData.winner = readInt(); ChatArea.addText(">>> The server has ended the game.", 142); nullifyPlayData(); target.handleEvent(new Event(this, 1001, Integer.toString(172))); break; case 113: // 'q' ChatArea.addText(">>> You have disconnected from the server, exiting", 142); closeClient(); break; } } } public synchronized boolean sendNick(String s) { boolean flag = false; try { os.writeInt(111); os.writeInt(s.length()); os.writeChars(s); intIn = is.readInt(); switch(intIn) { case 131: ChatArea.addText(">>> Your nick is already used", 141); break; case 132: ChatArea.addText(">>> Client connected to server", 142); flag = true; break; case 113: // 'q' ChatArea.addText(">>> Server has disconnected", 141); break; } } catch(IOException _ex) { } return flag; } public synchronized void readNicks() { boolean flag = false; nullifyConnectionData(); for(int j = 0; j < C.MAX_NUM_OF_PLAYERS; j++) { int i = readInt(); if(i == 126) return; ClientData.connected[i] = true; ClientData.nicks[i] = readLine(); } } public synchronized void readLetterValues() { for(int i = 0; i < 26; i++) ClientData.letterValues[i] = readInt(); } public synchronized void sendMessage(String s, int i) { String s1 = new String(""); if(i == 129) s1 = "<" + nick + "> " + s; else s1 = "*" + nick + "* " + s; try { os.writeInt(112); os.writeInt(s1.length()); os.writeChars(s1); os.writeInt(i); return; } catch(IOException _ex) { closeClient(); } } public synchronized String readLineWithLength(int i) { StringBuffer stringbuffer = new StringBuffer(""); try { for(int j = 0; j < i; j++) stringbuffer.append(is.readChar()); } catch(IOException _ex) { closeClient(); } return stringbuffer.toString(); } public synchronized String readLine() { boolean flag = false; StringBuffer stringbuffer = new StringBuffer(""); try { int i = readInt(); for(int j = 0; j < i; j++) stringbuffer.append(is.readChar()); } catch(IOException _ex) { closeClient(); } return stringbuffer.toString(); } public void readGameData() { if(!ClientData.gameInProgress) { try { ClientData.myNumber = is.readInt(); ClientData.isSpellerUsed = is.readBoolean(); ClientData.isTimeLimitUsed = is.readBoolean(); ClientData.timeLimit = is.readInt(); ClientData.clientsCurrentlyConnected = is.readInt(); } catch(IOException _ex) { closeClient(); } readLetterValues(); readNicks(); try { os.writeBoolean(gameDataRecievedOk); } catch(IOException _ex) { closeClient(); } StatusBarPanel.updateConnected(); ChatArea.updateChoiceList(); if(!ServerData.amI_Server) { ServerData.timeLimit = ClientData.timeLimit; ServerData.isSpellerUsed = ClientData.isSpellerUsed; ServerData.isTimeLimitUsed = ClientData.isTimeLimitUsed; ServerData.clientsCurrentlyConnected = ClientData.clientsCurrentlyConnected; ServerData.letterValues = ClientData.letterValues; ServerData.nicks = ClientData.nicks; ServerData.connected = ClientData.connected; return; } } else if(ClientData.gameInProgress) { ClientData.clientsCurrentlyConnected = readInt(); for(int i = 0; i < ClientData.clientsCurrentlyConnected; i++) ClientData.playersOrder[i] = readInt(); readNicks(); try { os.writeBoolean(true); } catch(IOException _ex) { closeClient(); } StatusBarPanel.updateConnected(); ChatArea.updateChoiceList(); if(!ServerData.amI_Server) { ServerData.clientsCurrentlyConnected = ClientData.clientsCurrentlyConnected; ServerData.nicks = ClientData.nicks; ServerData.connected = ClientData.connected; } } } public void nullifyConnectionData() { for(int i = 0; i < C.MAX_NUM_OF_PLAYERS; i++) { ClientData.connected[i] = false; ClientData.nicks[i] = null; } } public void nullifyPlayData() { ClientData.gameInProgress = false; ClientData.whoseTurn = -1; ClientData.myTurn = false; ClientData.turnStatus = 166; for(int i = 0; i < C.MAX_NUM_OF_PLAYERS; i++) ClientData.playersScores[i] = 0; } public void readBankLetters() { try { for(int i = 0; i < 7; i++) ClientData.bankLetters[i] = is.readChar(); return; } catch(IOException _ex) { closeClient(); } } public int readInt() { int i = 0; try { i = is.readInt(); } catch(IOException _ex) { closeClient(); } return i; } public synchronized void closeClient() { ClientData.amI_Connected = false; ClientData.myTurn = false; if(os != null && clientSocket != null && is != null) { if(!ServerData.amI_Server) try { os.writeInt(114); } catch(IOException _ex) { } try { os.close(); is.close(); clientSocket.close(); } catch(IOException _ex) { } } StatusBarPanel.updateDisconnected(); ChatArea.addText(">>> Connection closed", 142); nullifyConnectionData(); ChatArea.updateChoiceList(); target.handleEvent(new Event(this, 1001, Integer.toString(152))); stop(); } }