Debug output added.
[ChatApp.git] / ChatApp / appClient.java
blob07aadd313868f775d1d7a9163d7c7ceed40a2c62
1 /*
2 * © 2010 ROBO Design
3 * http://www.robodesign.ro
5 * $Date: 2010-05-19 14:09:54 +0300 $
6 */
8 package ChatApp;
10 import java.io.BufferedReader;
11 import java.io.InputStreamReader;
12 import java.io.PrintWriter;
13 import java.net.Socket;
14 import java.net.UnknownHostException;
15 import javax.swing.DefaultListModel;
17 // clasa ce se ocupa de conectarea unui client la un server de chat.
19 public class appClient extends Thread {
20 private appMain myApp;
21 private volatile String serverAdresa;
22 private volatile int serverPort;
23 private volatile String numeUtilizator;
24 private volatile boolean serverConectat;
25 private Socket clientSocket;
26 private PrintWriter clientOut;
27 private BufferedReader clientIn;
28 private DefaultListModel listaClienti;
30 // initializare clasa
31 public appClient (appMain rootApp) {
32 myApp = rootApp;
33 listaClienti = new DefaultListModel();
35 serverAdresa = "";
36 serverPort = 0;
37 numeUtilizator = "";
38 serverConectat = false;
40 clientSocket = null;
41 clientOut = null;
42 clientIn = null;
45 // conectare la server
46 public boolean conectare (String nume, String server, int port) {
47 if (serverConectat) {
48 if (server.equals(serverAdresa) && port == serverPort && nume.equals(numeUtilizator)) {
49 return true;
50 } else {
51 System.err.println("appClient.conectare: aplicatia este deja conectata la un alt server.");
52 return false;
54 } else if (clientSocket != null) {
55 System.err.println("appClient.conectare: aplicatia este intr-o stare invalida.");
56 return false;
59 // verificare nume
60 if (nume == null || nume.isEmpty() || nume.trim().isEmpty() || nume.indexOf(" ") != -1 || nume.equals("#server") || listaClienti.contains(nume)) {
61 System.err.println("appClient.conectare: numele dat este invalid. " + nume);
62 return false;
65 serverAdresa = server;
66 serverPort = port;
67 numeUtilizator = nume;
69 System.out.println("appClient.conectare " + numeUtilizator + " " + serverAdresa + " " + serverPort);
71 // pornire conexiune socket
72 try {
73 clientSocket = new Socket(serverAdresa, serverPort);
74 clientOut = new PrintWriter(clientSocket.getOutputStream(), true);
75 clientIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
77 } catch (UnknownHostException ex) {
78 System.err.println("appClient.conectare: Serverul nu poate fi gasit: " + serverAdresa + ". " + ex);
79 ex.printStackTrace();
81 clientSocket = null;
82 clientOut = null;
83 clientIn = null;
85 return false;
87 } catch (Exception ex) {
88 System.err.println("appClient.conectare: Conectarea la server a esuat. " + ex);
89 ex.printStackTrace();
91 clientSocket = null;
92 clientOut = null;
93 clientIn = null;
95 return false;
98 serverConectat = true;
100 // pornire thread separat de monitorizare a socketului
101 start();
103 return true;
106 // metoda ce ruleaza constant intr-un thread separat, cat timp utilizatorul
107 // este conectat la server.
108 public void run () {
109 if (!serverConectat || clientIn == null || clientSocket == null || clientSocket.isClosed()) {
110 System.err.println("appClient.run: starea aplicatiei este invalida.");
111 return;
114 System.out.println("appClient.run start " + numeUtilizator);
116 myApp.afisarePaginaChat();
118 if (!trimiteComanda("/conectare " + numeUtilizator)) {
119 System.err.println("appClient.run: trimiteComanda('/conectare') a esuat. ");
120 serverConectat = false;
123 String cmd = null;
125 while (serverConectat && clientIn != null && clientSocket != null && !clientSocket.isClosed()) {
126 try {
127 cmd = clientIn.readLine();
128 } catch (Exception ex) {
129 System.err.println("appClient.run: clientIn.readLine a esuat. " + ex);
130 ex.printStackTrace();
131 break;
134 if (cmd == null || cmd.trim().isEmpty()) {
135 break;
138 procesareComanda(cmd);
139 cmd = null;
142 System.out.println("appClient.run end " + numeUtilizator);
144 serverConectat = false;
146 try {
147 if (clientOut != null) {
148 clientOut.close();
150 if (clientIn != null) {
151 clientIn.close();
153 if (clientSocket != null && !clientSocket.isClosed()) {
154 clientSocket.close();
156 } catch (Exception ex) {
157 System.err.println("appClient.deconectare: inchidere socket esuata. " + ex);
158 ex.printStackTrace();
161 clientSocket = null;
162 clientOut = null;
163 clientIn = null;
165 if (!listaClienti.isEmpty()) {
166 listaClienti.clear();
169 myApp.deconectareClientCompleta();
172 // metoda ce permite trimiterea de comenzi de la client catre server.
173 private synchronized boolean trimiteComanda (String cmd) {
174 if (!serverConectat || clientSocket == null || clientSocket.isClosed() || clientOut == null || cmd == null || cmd.isEmpty()) {
175 System.err.println("appClient.trimiteComanda a esuat. Serverul nu este conectat, sau starea aplicatiei este invalida.");
176 return false;
179 System.out.println("appClient.trimiteComanda " + cmd);
181 try {
182 clientOut.println(cmd);
183 } catch (Exception ex) {
184 System.err.println("appClient.trimiteComanda a esuat. " + ex);
185 ex.printStackTrace();
186 return false;
189 return true;
192 // metoda ce proceseaza comenzile primite de la server.
193 private boolean procesareComanda (String cmd) {
194 if (!serverConectat) {
195 System.err.println("appClient.procesareComanda: serverul nu este conectat.");
196 return false;
199 String[] arg = cmd.split(" ");
200 String fn = arg[0]; // functia, primul element
202 System.out.println("appClient.procesareComanda " + fn + " cmd " + cmd);
204 if ("/conectare".equals(fn) && arg.length == 2) {
205 ev_conectareClient(arg[1]);
206 } else if ("/deconectare".equals(fn) && arg.length == 2) {
207 ev_deconectareClient(arg[1]);
208 } else if ("/conflict-nume".equals(fn) && arg.length == 1) {
209 ev_conflictNume();
210 } else if ("/mesaj".equals(fn) && arg.length > 2) {
211 ev_mesajPrimit(arg[1], arg[2], myApp.stringArrayJoin(arg, " ", 3));
212 } else if ("/nume".equals(fn) && arg.length == 3) {
213 ev_schimbareNume(arg[1], arg[2]);
214 } else if ("/lista".equals(fn) && arg.length > 1) {
215 ev_listaClienti(arg);
216 } else {
217 return false;
220 return true;
223 // metoda permite trimiterea de mesaje catre alti utilizatori, de la
224 // utilizatorul/clientul actual.
225 public boolean trimiteMesaj (String catre, String msg) {
226 if (!serverConectat || catre == null || catre.trim().isEmpty() || catre.indexOf(" ") != -1 || msg == null || msg.trim().isEmpty() || catre.equals(numeUtilizator) || (!catre.equals("#server") && !listaClienti.contains(catre))) {
227 System.err.println("appClient.trimiteMesaj: parametrii nu sunt validati.");
228 return false;
231 return trimiteComanda("/mesaj " + numeUtilizator + " " + catre + " " + msg);
234 // metoda permite clientului sa-si schimbe numele.
235 public boolean schimbareNume (String numeNou) {
236 if (!serverConectat || numeNou == null || numeNou.trim().isEmpty() || numeNou.indexOf(" ") != -1 || numeNou.equals("#server") || listaClienti.contains(numeNou)) {
237 System.err.println("appClient.schimbareNume: parametrii nu sunt validati.");
238 return false;
241 return trimiteComanda("/nume " + numeUtilizator + " " + numeNou);
244 // urmeaza cateva metode care sunt chemate in funcite de comenzile primite de
245 // la server.
247 private synchronized void ev_conectareClient (String nume) {
248 System.out.println("appClient.ev_conectareClient " + nume);
249 if (nume.equals("#server")) {
250 System.err.println("appClient.ev_conectareClient numele este invalid: " + nume);
251 return;
254 if (!listaClienti.contains(nume)) {
255 listaClienti.addElement(nume);
256 myApp.ev_conectareClient(nume);
257 } else {
258 System.err.println("appClient.ev_conectareClient numele exista deja " + nume);
262 private synchronized void ev_deconectareClient (String nume) {
263 System.out.println("appClient.ev_deconectareClient " + nume);
265 if (nume.equals("#server") || nume.equals(numeUtilizator)) {
266 deconectare();
267 myApp.ev_deconectareClient(nume);
268 } else if (listaClienti.contains(nume)) {
269 listaClienti.removeElement(nume);
270 myApp.ev_deconectareClient(nume);
271 } else {
272 System.err.println("appClient.ev_deconectareClient numele nu exista " + nume);
276 private void ev_conflictNume () {
277 String numeNou = myApp.ev_conflictNume();
278 if (numeNou == null || numeNou.trim().isEmpty() || numeNou.indexOf(" ") != -1 || numeNou.equals("#server")) {
279 myApp.deconectareGUI();
280 return;
283 numeUtilizator = numeNou;
284 trimiteComanda("/conectare " + numeNou);
287 private synchronized void ev_schimbareNume (String numeVechi, String numeNou) {
288 if (numeVechi.equals("#server") || numeNou.equals("#server")) {
289 return;
292 int i = listaClienti.indexOf(numeVechi);
293 if (i != -1) {
294 listaClienti.set(i, numeNou);
295 } else {
296 System.err.println("appClient.ev_schimbareNume numeVechi nu exista: " + numeVechi);
297 listaClienti.addElement(numeNou);
300 // schimbarea numelui, la clientul local
301 if (numeVechi.equals(numeUtilizator)) {
302 numeUtilizator = numeNou;
305 myApp.ev_schimbareNume(numeVechi, numeNou);
308 private synchronized void ev_listaClienti (String[] raw) {
309 System.out.println("appClient.ev_listaClienti");
311 if (!raw[0].equals("/lista")) {
312 System.err.println("appClient.ev_listaClienti raw[0] != /lista");
313 return;
316 listaClienti.clear();
317 for (int i = 1; i < raw.length; i++) {
318 listaClienti.addElement(raw[i]);
321 myApp.ev_listaClienti();
324 private void ev_mesajPrimit (String dela, String catre, String msg) {
325 System.out.println("appClient.ev_mesajPrimit dela " + dela + " catre " + catre);
327 if (dela.equals(catre) || dela.equals("#server")) {
328 System.err.println("appClient.ev_mesajPrimit eronat dela " + dela + " catre " + catre);
329 } else if (catre.equals("#server") || dela.equals(numeUtilizator) || catre.equals(numeUtilizator)) {
330 myApp.ev_mesajPrimit(dela, catre, msg);
331 } else {
332 System.err.println("appClient.ev_mesajPrimit eronat dela " + dela + " catre " + catre);
336 // metoda permite deconectarea de la server
337 public void deconectare () {
338 if (!serverConectat) {
339 return;
341 System.out.println("appClient.deconectare " + numeUtilizator);
343 trimiteComanda("/deconectare " + numeUtilizator);
345 serverConectat = false;
346 if (!listaClienti.isEmpty()) {
347 listaClienti.clear();
351 public boolean getServerConectat () {
352 return serverConectat;
355 public String getServerAdresa () {
356 return serverAdresa;
359 public int getServerPort () {
360 return serverPort;
363 public String getNumeUtilizator () {
364 return numeUtilizator;
367 public DefaultListModel getListaClienti () {
368 return listaClienti;
372 // vim:set fo=wancroql tw=80 ts=2 sw=2 sts=2 sta et ai cin ff=unix: